Как реализовать наборы предпочтений / флагов для всех полей в модели Django? - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть модель Актива с несколькими дюжинами характеристик Актива:

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, )

Один из этих подходов лучше, чем другой?Или я должен заниматься чем-то другим полностью?

Кроме того, если у вас есть какие-либо рекомендации по реализации одного из этих подходов, пожалуйста, дайте мне знать.

...