Хранение клиентской карты Django

Мне нужно хранить карточки постоянного клиента. Она должна быть гибкой. У меня есть несколько вариантов карт с разными системами скидок.
Например, карта по сумме покупок - > $100 - 5%, > $1000 - 10% и т.д. Или по количеству посещений - > 10 - 3%, 100 - 10% и т.д.
. Кроме того, он должен хранить различные изображения для разных типов карт и сумм продаж, например, 5% - серебряный цвет, 10% - золотой и т.д.
Я придумал хранить данные в базе данных в виде JSON.
Например:

schema = {1: {'discount': 5%, image: '....', 'style': {'background': ..., 'foreground': ...},
          2: {'discount': 10%, image: '....', 'style': {'background': ..., 'foreground': ...},
          3: {'discount': 15%, image: '....', 'style': {'background': ..., 'foreground': ...},
 }
class ABSCard(models.Model):
   title = field
   work_place = field
   ....
class Discount(models.Model):
   type = ....
   schema = JSONField
   abscard_id = ABSCard
   

Но я не уверен, что хранение JSON в PostgreSQL - лучший способ.

Предложение: сделайте ваши схемы объектными инстанциями модели

На вашем месте я бы создал схему для различных типов скидок с помощью Models, а затем создал бы реальные объекты в базе данных для различных скидок.

Вот как я бы закодировал модели:

from django.utils.translation import gettext_lazy as _

# enumerator for field in model below
class DISCOUNT_TYPES(models.IntegerChoices):
    VOLUME = 0, _("Volume")
    VISIT = 1, _("Visit")

# enumerator for field in model below
class STYLING_CLASSES(models.IntegerChoices):
    GOLD = 0, _("Gold")
    SILVER = 1, _("Silver")
    BRONZE = 2, _("Bronze")

class Discount(models.Model):
    discount_percentage = PositiveSmallIntegerField
    discount_type = PositiveSmallIntegerField(choices=DISCOUNT_TYPES, default=DISCOUNT_TYPES.VOLUME)
    amount_to_spend = PositiveSmallIntegerField(null=True, blank=True)
    num_visits = PositiveSmallIntegerField(null=True, blank=True)
    css_class = CharField(choices=STYLING_CLASSES, default=STYLING_CLASSES.BRONZE)

    # or instead of img URL you could do a FileField if you want to store the static image yourself
    img_url = URLField

class Card(models.Model):
    name = CharField(max_length=60)

    # or if you want multiple discounts associated with a card, you could use a ManyToManyField here instead
    discount = ForeignKeyField(Discount, on_delete=models.CASCADE)

Преимущества этого метода

Гибкость

Таким образом, вы можете связать одну или несколько скидок (Discount объект модели) с любым заданным Card объектом модели. Это дает вам возможность гибко настраивать модель в дальнейшем. Например, вы можете создать третью модель под названием UserLoyaltyCard, которая связывает объект Card (разница в том, что объект Card является общим, а UserLoyaltyCard может иметь поле User foreign-key и поле ID_number, например).

Стайлинг

Обратите внимание, что в модели Discount выше есть простое поле css_class. Таким образом, ваши CSS-определения будут находиться в статическом CSS-файле (или на фронтенде, если это просто API для бэкенда), где и должна быть стилизация, а не в вашей базе данных.

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