我正在尝试为像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)发布于 2021-09-26 05:33:57
SmallIntegerField在MySQL中为smallint (maximum signed value 32767,display width 6)。
我假设您希望在MySQL中使用tinyint (maximum signed value 127,display width 3)。
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中显示文字宽度(maximum signed value 2147483647,display width 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)https://stackoverflow.com/questions/69243627
复制相似问题