自动字段不减少列的长度

我试图创建自动递增字段的小整数,如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 smallint (ma(签署的最大价值32767 display width 6<显示宽度6) in MySQL.

在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)
阅读全文

▼ 版权说明

相关文章也很精彩
推荐内容
更多标签
相关热门
全站排行
随便看看

错说 cuoshuo.com —— 程序员的报错记录

部分内容根据CC版权协议转载;网站内容仅供参考,生产环境使用务必查阅官方文档

辽ICP备19011660号-5

×

扫码关注公众号:职场神器
发送: 1
获取永久解锁本站全部文章的验证码