Есть ли преимущества в использовании поля 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":
- #22837 (Миграции обнаруживают нежелательные(?) изменения) - Django
- #30048 (Миграции создаются при изменении verbose_name или help_text) - Django .
Есть ли еще какая-нибудь польза от наличия поля 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',
]