В настоящее время я создаю простое приложение в Django и пытаюсь обосноваться на хорошем дизайне модели.Использование моделей вместо выбора для перечислений в Django
Первый подход
В Django documentation и многие blog posts я читал, аргумент choice
ключевое слово рекомендуется. Это будет осуществляться в моей (упрощенном) модели существительного так:
class Noun(models.Model):
FEMININE = 0
MASCULINE = 1
NEUTER = 2
COMMON = 3
GENDER_TYPE = (
(FEMININE, "Feminine"),
(MASCULINE, "Masculine"),
(NEUTER, "Neuter"),
(COMMON, "Common"),
)
stem = models.CharField(max_length=200)
gender = models.IntegerField(choices=GENDER_TYPE, default=Noun.COMMON)
Второго подход
Когда я шел по коридору и говорил с другим дб администратора о том, как он будет указывать перечисления в базе данных, он признал дебаты, но сказал, что он будет составлять таблицу для каждого перечисления и ссылаться на нее по иностранному ключу. Такой подход отображает почти точно к следующим моделям:
class Gender(models.Model):
short_name = models.CharField(max_length=1) # M, F, N, or C
description = models.CharField(max_length=20) # Masculine, Feminine, Neuter, or Common
class Noun(models.Model):
stem = models.CharField(max_length=200)
gender = models.ForeignKey(Gender, on_delete=models.CASCADE)
Я пытаюсь взвесить все относительные достоинства каждого подхода. Вот про и против я могу различить:
Первый подход
- Герметичная
- Нет необходимости импортировать модель «Пол»
- Не требует дополнительного шага заполнения значений перечисления в база данных
- Легче читать в коде: мне не нужно смотреть в базу данных, чтобы увидеть действительные значения
Второй подход
- Гораздо более гибким: Я могу изменить все женские слова мужской в один шаг, или добавить новый пол без необходимости модифицировать таблицу существительного
- Логика предписана ограничение внешнего ключа, а не код, сохраняя целостность данных
Итак, мой вопрос: Я пропустил что-то очевидное о том, почему один подход недействителен? Если оба подхода действительны, какой подход лучше?
Я думаю, что оба подхода действительны, и лучший выбор зависит от ситуации. Если вы не измените свой выбор в будущем, я бы определенно пошел с подходом «ForeignKey». – ilse2005