1

我正在尝试为像 int(3) 这样的小整数创建自动增量字段。

如果我尝试AutoField,它会生成 11 的长度。如果我使用max_length,迁移会忽略它。

SmallIntegerField给出不自动递增的 int(6)。

我的模型定义:

class tblroles(models.Model):
    role_id = SmallIntegerField(primary_key=True, verbose_name="role_id")
    name = CharField(max_length=20)
    is_active = BooleanField(default=False)
4

2 回答 2

2

Django 没有tinyint字段。db_type(...)但是,您可以通过将方法覆盖为

from django.db.models import SmallAutoField


class TinyAutoField(SmallAutoField):

    def db_type(self, connection):
        return "tinyint AUTO_INCREMENT"

用法

class FooBar(models.Model):
    id = TinyAutoField(
        primary_key=True,
    )

    def __str__(self):
        return f"{self.id}"

PS :此解决方案在MySQL 8.0中完美运行

于 2021-09-26T19:15:33.557 回答
1

SmallIntegerField在 MySQL 中是smallint(最大有符号值32767,显示宽度)。6

我想你想要tinyint(最大有符号值127,显示宽度3)在 MySQL 中。

class TinyAutoField(models.SmallAutoField):

    def db_type(self, connection):
        if connection.vendor == 'mysql':
            return 'tinyint AUTO_INCREMENT'
        return super().db_type(connection)

    def rel_db_type(self, connection):
        if connection.vendor == 'mysql':
            return 'tinyint'
        return super().db_type(connection)

用法:

class tblroles(models.Model):
    # role_id = SmallIntegerField(primary_key=True, verbose_name="role_id")  # Change this
    role_id = TinyAutoField(primary_key=True, verbose_name="role_id")        # to this
    # ...

但是如果你想要 MySQL 中的文字int(3)(最大有符号值2147483647,显示宽度3)。

class AutoField(models.AutoField):

    def __init__(self, *args, **kwargs):
        self.display_width = kwargs.pop('display_width', None)
        super().__init__(*args, **kwargs)

    def db_type(self, connection):
        if connection.vendor == 'mysql' and self.display_width:
            return 'int(%s) AUTO_INCREMENT' % self.display_width
        return super().db_type(connection)

    def deconstruct(self):
        name, path, args, kwargs = super().deconstruct()
        if self.display_width:
            kwargs['display_width'] = self.display_width
        return name, path, args, kwargs

用法:

class tblroles(models.Model):
    # role_id = SmallIntegerField(primary_key=True, verbose_name="role_id")
    role_id = AutoField(primary_key=True, verbose_name="role_id", display_width=3)
于 2021-09-26T05:33:57.370 回答