У меня есть модель Актива с несколькими дюжинами характеристик Актива:
class Asset(models.Model):
manufacturer = models.CharField(max_length=20)
model = models.CharField(max_length=20)
serial = models.CharField(max_length=20)
...
Для каждого поля в модели Актива я хочу иметь возможность добавлять предпочтения.Например, должен ли серийный номер отображаться для конечных пользователей?Должен ли серийный номер быть включен в штрих-коды?и т.д.
Я хочу иметь возможность хранить эту информацию в СУХОЙ манере и иметь возможность добавлять дополнительные наборы предпочтений в будущем.Я не хочу использовать битовые поля, так как они не подходят для запросов.Вот два способа, которые я задумал реализовать:
Первый вариант - использовать пользовательское поле JSON для хранения наборов предпочтений.Для каждого имени предпочтения (например, «include_in_barcode» или «include_in_reports») связанный JSONField будет иметь словарь всех полей в модели активов и значение предпочтения для этого поля:
class Preference(models.Model):
name = models.Charfield(max_length=20) # e.g.: 'include_in_barcode' or 'include_in_reports'
prefs = models.JSONField() # list each field in the 'model' model, along with preference for that field
Пример экземпляра может выглядеть следующим образом:
<name: 'include_in_barcode', prefs: '{"manufacturer": "True","model": "True","serial": "False"}'>
Этот подход может быть даже потенциально расширен для учета различных классов моделей, чтобы обеспечить еще большее расширение:
class Preference(models.Model):
name = models.Charfield(max_length=20) # e.g.: include_in_barcode
prefs = models.JSONField() # list each field in the 'model' model, along with preference for that field
model = models.Charfield(max_length=20) # 'Assets' or other models where I need preferences for each model field
ОпцияДва использует две таблицы: одну для именования каждого типа предпочтения, а другую с парами ключ-значение от имени и описания предпочтения до отдельных имен полей в модели активов вместе со значением для этой комбинации предпочтения и имени поля:
class Preference(models.Model):
name = models.Charfield(max_length=20) # e.g.: include_in_barcode
description = models.Charfield(max_length=200) # description of this preference
class AssetPreference(models.Model):
field_name = models.Charfield(max_length=20) # e.g.: 'manufacturer' or 'serial'
prefs = ForeignKey(Preference, on_delete=models.CASCADE)
value = models.BooleanField(default=False, )
Один из этих подходов лучше, чем другой?Или я должен заниматься чем-то другим полностью?
Кроме того, если у вас есть какие-либо рекомендации по реализации одного из этих подходов, пожалуйста, дайте мне знать.