Отношения между моделями 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

Честно говоря, мне кажется, что ваша настройка моделей уже довольно стабильна. Я не могу сказать, как разделить модели во время выполнения проекта. Я никогда этого не делал.

Дайте мне знать, как это происходит!

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