Класс модели Django против словаря для хранения ссылочных значений
Я довольно новичок в Django, и при создании проекта я метался туда-сюда между использованием словаря фиксированных значений для определенных ссылочных значений или использованием другого класса модели, который ссылается с помощью поля Foreign Key.
Часть кода, использующая опцию класса модели, выглядит следующим образом:
Модели со ссылочными значениями:
class MaterialCategory(models.Model):
name = models.CharField(max_length=32, unique=True, help_text="A primary class of materials.")
class Meta:
verbose_name_plural = 'Material categories'
constraints = [
UniqueConstraint(
Lower('name'),
name='materialcategory_name_case_insensitive_unique',
violation_error_message="Material category already exists in "
"the database!"
),
]
class ComponentType(models.Model):
"""Model for key component types of a water supply scheme."""
name = models.CharField(max_length=100, unique=True, help_text="Main categories of a water system")
def __str__(self) -> str:
return self.name
class Meta:
ordering = ["name", "id",]
Пример модели, указанный выше:
class Chlorinator(models.Model):
"""Model representing a chlorinator."""
CHOICES_YES_NO = {"yes": "Yes", "no": "No", "na": "Not applicable"}
CHLORINATOR_TYPES = {
'cc' : 'Constant head chlorinator',
'nc' : 'Simple tank (non-constant head)',
'dp' : 'Chlorine dosing pump',
'gc' : 'Gas chlorination system',
'o' : 'Other',
}
id = models.UUIDField(
primary_key=True, default=uuid.uuid4, help_text="Unique ID for the chlorinator instance",
)
component_type = models.ForeignKey(
ComponentType, on_delete=models.RESTRICT,
limit_choices_to=Q(name__istartswith='treatment'), default=''
)
chlorinator_type = models.CharField("Chlorinator type", max_length=2, choices=CHLORINATOR_TYPES)
material = models.ForeignKey(
Material, on_delete=models.RESTRICT, blank=True, null=True,
limit_choices_to=Q(material_category__name__istartswith='composites')
)
def __str__(self) -> str:
return f"{self.id} - {self.CHLORINATOR_TYPES[self.chlorinator_type]}"
class Meta:
ordering = ['chlorinator_type', 'id',]
Есть еще 10 или около того моделей, похожих на эту, все они используют первые две эталонные модели.
Сейчас, пока я тестирую их, мне кажется, что я мог бы использовать словарь для хранения "Материалов" и "Типов компонентов", а затем ссылаться на них в последующих моделях. Но я не уверен, что это в какой-то мере неэффективно или плохой дизайн.
Хотелось бы получить чей-нибудь комментарий о том, какой метод лучше, и, если возможно, почему.
(словарь фиксированных значений, о котором я говорил, будет глобальным словарем)