2

IntegerChoices在我的 Django (3.2) 模型中使用。

class AType(db.IntegerChoices):
    UNKNOWN = 0, 'Unknown'
    SOMETHING = 1, 'Something'
    ANOTHER_THING = 2, 'Another thing'
    A_THIRD_THING = 3, 'A third thing'


class MyObject(models.Model):
    a_type = db.IntegerField(choices=AType.choices)

(我已将选择更改为更通用。)

每次我向 AType 添加一个值时,它都会产生一个数据库迁移,我会忠实地应用它。

a_type严格在幕后。用户永远不会看到它,所以它只在管理 UI 中,但我不需要它是可编辑的。所以表格并没有真正使用。

这些迁移对数据库有什么影响(例如,约束)?

鉴于 IntegerChoices 字段没有显示给(非员工)用户,也没有以表格形式显示,是否还有其他实用程序?

如果没有实用程序,我正在考虑更改MyObject.a_type为 IntegerField,并继续在AType任何地方使用,但不进行所有迁移。

4

1 回答 1

1

这些迁移对数据库有什么影响(例如,约束)?

对架构没有影响。你可以在python manage.py sqlmigrate myapp 000x_mymigration.

但是,它仍然可以CREATE TABLEINSERT INTO ... SELECT(昂贵)DROP TABLE,,ALTER TABLE

这是“设计”和“wontfix”:

鉴于 IntegerChoices 字段没有显示给(非员工)用户,也没有以表格形式显示,是否还有其他实用程序?

是的,模型验证。
参考:https ://docs.djangoproject.com/en/3.2/ref/models/fields/#choices

我正在考虑只是更改MyObject.a_type为 IntegerField,并继续在AType任何地方使用,但没有进行所有迁移。

您可以通过choices修补MigrationAutodetector和忽略makemigrationsmigrate

您还可以忽略_verbose_nameand help_text

mysite/apps.py:

from django.apps import AppConfig
from django.core.management.commands import makemigrations, migrate
from django.db import models
from django.db.migrations import autodetector


class MigrationAutodetector(autodetector.MigrationAutodetector):
    ignored_field_attribute_names = [
        'choices',
        # '_verbose_name',
        # 'help_text',
    ]

    def deep_deconstruct(self, obj):
        if isinstance(obj, models.Field):
            for attr_name in self.ignored_field_attribute_names:
                setattr(obj, attr_name, None)
        return super().deep_deconstruct(obj)


class MySiteAppConfig(AppConfig):
    name = 'mysite'

    def ready(self):
        makemigrations.MigrationAutodetector = MigrationAutodetector
        migrate.MigrationAutodetector = MigrationAutodetector
        pass

我的网站/settings.py:

INSTALLED_APPS = [
    # ...
    'mysite.apps.MySiteAppConfig',
]
于 2021-09-25T09:01:36.330 回答