@trickster2019

Как добавить к основному продукту вспомогательный в django rest framework?

Добрый день, имеется модель с продуктом, там и кофе и десерты и топпинги
class Product (models.Model):
    name = models.TextField(null=True)
    description= models.TextField(null=True)
    type = models.TextField(null=True)
    price = models.IntegerField(null=True)
    volume= models.IntegerField(null=True)
    urlsImage=models.ImageField(upload_to=upload_to)
    urlsIcon=models.ImageField(upload_to=upload_to)

    class Meta:
        ordering = ['name']

    def __str__(self):
        return self.name[0:50]

модель заказа
class Order (models.Model):
    userToken = models.TextField(default="")
    date= models.DateTimeField(auto_now_add=True)
    product = models.ManyToManyField(Product)

Так вот, как сделать так чтобы к кофе можно было применить топпинг? Изначально была идея сделать отдельную модель с топпингом и в модели продукта сделать отдельное поле, которое было бы нулёвым по умолчанию, но если бы топпинг применялся в это поле вписывался бы сам топпинг, то по итогам реализации это оказалось очень кривой идеей, так как на мобильном устройстве (API делается под мобилку) распарсить весь этот балаган оказалось проблематично.
  • Вопрос задан
  • 67 просмотров
Решения вопроса 1
trapwalker
@trapwalker
Программист, энтузиаст
А в чем проблема добавлять в заказ кофе отдельно, а топинг отдельно?
На самом деле не зватает данных о том. как вы собираетесь это всё запрягать.
Лучше сохранить плоскую простую структуру, а топинги просто указывать сразу после кофе.
В одном заказе может быть несколько кофе с разными топингами.
Вы можете сделать вместо ManyToMany модель произведения Заказе на Продукт в ручную:
ПродуктВЗаказе(Заказ, Продукт, порядковый_индекс).

Но вот я вижу у вас в Продукте какой-то volume. Это что значит, капучино у вас представлено в таблице продуктов всеми доступными объёмами? А топинги тоже определены объёмами?
Если так, то Продукт у вас абстрактен, а в заказе он представлен таблицей ПродуктВЗаказе.

Благодаря упорядоченности этой таблицы можно условиться, что если Продукт дополнительный, то он должен идти после продукта. в который его добавляют. Это чтобы по Заказу можно было однозначно приготовить кофе и не перепутать топинги.
Минусов такого подхода несколько:
- нужны методы перестановки элементов заказа, чтобы, например, заменить топинг к первому кофе из нескольких указанных в заказе.
- если дополнитеьный продукт вроде топинга может оказаться и основным продуктом, то флаг его дополнительности придётся указывать в модели РодуктыВЗаказе. К примеру, можно заказать лимон и текилу по отдельности, а можно лимон в качестве добавки в чай. В этом случае нельзя указать в Продукте "Лимон" атрибут "дополнительный", ну или придется заводить отдельные Продукты для одного и того же лимона.

Я бы не парился с признаком "дополнительности" у Продуктов, а вынес это флаг в таблицу ПродуктыВЗаказе и сделал бы методы перестановки элементов.
Тогда заказ бы у меня был плоский, но выглядел как-то так:
Капучино 300мл Арабика
+ Карамель
+ Корица
+ Шоколад
Эспрессо 400мл Арабика
+ Коньяк

Тогда, если девушка скажет: "ой. а можно мне ещё мятный сироп туда?"
Бариста в приложении добавит "+ Мятный сироп" и перетащит его над Эсрессо.

Плюсик будет определяться флагом в модели ПродуктыВЗаказе, а позиция целочисленным индексом в этой модели.
Индексы можно проставлять с шагом, например, в 1000, а при перестановке тогда просто апдейтить только переставляемую запись устанавливая индекс посерединке между любыми двумя соседними.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы