Есть ли преимущества в использовании поля IntegerChoices в модели Django, если оно не показывается пользователям?

Я использую 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 находится строго за сценой. Пользователи никогда не видят его, так что он находится только в пользовательском интерфейсе администратора, но мне не нужно, чтобы он был редактируемым. Так что формы на самом деле не используются.

Есть ли какое-либо влияние на БД (например, ограничения) от этих миграций?

Есть ли еще какая-нибудь польза от наличия поля IntegerChoices, учитывая, что оно не отображается для (нештатного) пользователя, и не в форме?

Если нет никакой утилиты, я думаю просто изменить MyObject.a_type на IntegerField, и продолжать использовать AType везде, но без всех миграций.

Есть ли влияние на БД (например, ограничения) от этих миграций?

Никакого влияния на схему. Вы можете увидеть это в python manage.py sqlmigrate myapp 000x_mymigration.

Однако, он все еще делает CREATE TABLE, INSERT 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 в makemigrations и migrate.

Вы можете дополнительно игнорировать _verbose_name и 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

mysite/settings.py:

INSTALLED_APPS = [
    # ...
    'mysite.apps.MySiteAppConfig',
]
Вернуться на верх