首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AutoField不会减少列的长度

AutoField不会减少列的长度
EN

Stack Overflow用户
提问于 2021-09-19 13:18:04
回答 1查看 109关注 0票数 1

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

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

SmallIntegerField给出的是int(6),没有自动递增。

我的模型定义:

代码语言:javascript
复制
class tblroles(models.Model):
    role_id = SmallIntegerField(primary_key=True, verbose_name="role_id")
    name = CharField(max_length=20)
    is_active = BooleanField(default=False)
EN

回答 1

Stack Overflow用户

发布于 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)。

代码语言:javascript
复制
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)

用法:

代码语言:javascript
复制
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)。

代码语言:javascript
复制
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

用法:

代码语言:javascript
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69243627

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档