Хранение клиентской карты 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 для бэкенда), где и должна быть стилизация, а не в вашей базе данных.