Отношения между моделями Django и разделение моделей на несколько таблиц в большом проекте
У меня немного проблем с моделями Django (в основном отношения), но я начну с кода, потом сделаю описание и задам вопросы...
Модели и отношения в Django в краткой (очень упрощенной) версии:
# Shorten version of services
SERVICES = [
("TC", "Tires Cleaning"),
("EC", "Exterior Cleaning"),
("IC", "Interior Cleaning"),
("CW", "Cleaning & Washing - full service"),
("WX", "Application of wax"),
]
class Client(models.Model):
name = models.CharField(max_length=35)
surname = models.CharField(max_length=35)
car = models.CharField(max_length=25)
class SingleService(models.Model):
service_name = models.CharField(max_length=35)
service_type = models.CharField(max_length=1, choices=SERVICES, default="CW")
price = models.IntegerField()
class SetOfServices(models.Model):
set_of_services = ????
price_of_set = ???
class Purchase(models.Model):
client = OneToOneField(client)
order = models.ForeignKey(SetOfServices, on_delete=models.CASCADE, blank=True, null=True)
price = ???
Я хочу сделать небольшой проект (Автомойка) с 8+ моделями django. Клиент приезжает на автомойку и я хочу хранить его имя/фамилию и марку/модель/тип автомобиля и т.д. в DB для будущего использования (клиенты, приезжающие снова, получат скидку и бесплатный кофе). Затем у меня есть модель SingleService с примерно 20-30 услугами - они имеют разное название и цену из-за разных задач / времени на изготовление и опций / дополнительных возможностей. Модель SetOfServices должна состоять из нескольких отдельных услуг (пользовательских, но настраиваемых из панели администратора Django, возможно, только один раз, во время установки / настройки). Поэтому это должен быть набор из нескольких услуг (я не хочу, чтобы клиент покупал только одну / единственную услугу!), например:
Пример набора 1: Очистка шин + Чистка салона
Пример НАБОР 2: Внешняя очистка + Нанесение воска
.... и так далее. Я хочу объединить несколько услуг в один набор услуг, который клиент может купить (с некоторой скидкой - например).
Последняя модель (из приведенного выше кода, я планирую расширить этот проект) - это Purchase, где клиент заказывает один набор услуг (SetOfServices) и платит некоторую сумму денег. Проблемы, с которыми я столкнулся, это выбор правильного отношения для поля set_of_services и как рассчитать общую цену этого набора (поле price_of_set). Нужно ли использовать отношение ForeignKey (один ко многим) в поле set_of_service?
Как разделить модели Django (при расширении проекта) на несколько таблиц в базе данных (я использую PostgreSQL)? Не могли бы вы дать мне ссылку или пример кода для этого?
Вопрос, который вы хотите задать себе:
- Содержит ли один
SetOfServices
несколькоSingleService
--> ДА - Проявляется ли один
SingleService
в нескольких разныхSetOfServices
? --> ДА .
Если ваш ответ на эти вопросы два раза ДА, то отношения являются отношениями "многие-ко-многим".
class SetOfServices(models.Model):
set_of_services = models.ManyToManyField(SingleService)
# price_of_set --> does this really need to be stored in database?
@property
def price_of_set(self):
return sum([service.price for service in self.set_of_services]
Теперь вы хотите спросить себя:
- Позволяет ли
Purchase
купить несколькоSetOfServices
(это зависит от вашего выбора)? --> НЕТ .
- Покупается ли
SetOfServices
несколькимиPurchase
? --> ДА
YES YES --> ManyToMany
НЕТ ДА --> OneToMany --> ForeignKey
class Purchase(models.Model):
client = OneToOneField(client)
order = models.ForeignKey(SetOfServices, on_delete=models.CASCADE, blank=True, null=True)
# same advice as above for price = ???
@property
def price(self):
return self.order.price_of_set
Честно говоря, мне кажется, что ваша настройка моделей уже довольно стабильна. Я не могу сказать, как разделить модели во время выполнения проекта. Я никогда этого не делал.
Дайте мне знать, как это происходит!