Класс модели 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 или около того моделей, похожих на эту, все они используют первые две эталонные модели.

Сейчас, пока я тестирую их, мне кажется, что я мог бы использовать словарь для хранения "Материалов" и "Типов компонентов", а затем ссылаться на них в последующих моделях. Но я не уверен, что это в какой-то мере неэффективно или плохой дизайн.

Хотелось бы получить чей-нибудь комментарий о том, какой метод лучше, и, если возможно, почему.

(словарь фиксированных значений, о котором я говорил, будет глобальным словарем)

Вернуться на верх