我试图创建自动递增字段的小整数,如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)
###Django没有提供tinyint
field. But you can create a cus字段。但您可以通过重写,创建自定义自动递增的自动字段db_type(...)
method as
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中是完美的
# # #SmallIntegerField
is 32767
display width 6<显示宽度
6
) in MySQL.
我猜你想在MySQL中使用tinyint(最大符号值127显示宽度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中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)