Моделирование заказов на продукцию в Джанго - PullRequest
0 голосов
/ 31 октября 2018

У меня есть заказ определенного списка продуктов, и мне нужно смоделировать это в Django.

Каждый заказ имеет свойства:

id
email
total_price
line_items

line_items - это словарь продуктов и требуемое количество экземпляров этого продукта.

Товар - это отдельная модель, описывающая класс товаров.

Мне нужны отношения «многие ко многим» между Продуктом и Заказом, потому что каждый продукт может быть частью многих заказов, но в каждом заказе может быть много продуктов - как это выглядит в моих полях, учитывая, что у меня может быть заказ, который имеет 3 экземпляра одного продукта, 2 экземпляра другого и т. Д ...?

1 Ответ

0 голосов
/ 31 октября 2018

line_items - это словарь продуктов и количество экземпляров этого продукта.

Я бы предложил , а не , чтобы сохранить это в словаре. В реляционной базе данных обычно хранится это в другой таблице для нескольких записей. Преимущество этого в том, что он легко запрашивает . Например, для создания списка всех заказов, которые содержат определенный продукт или содержат определенный продукт с количеством, превышающим 50.

Таким образом, у нас обычно есть три таблицы:

+-------+  1    N  +--------------+  N    1  +---------+
| Order |----------| OrderProduct |----------| Product |
+-------+          +--------------+          +---------+
| email |          | quantity     |
+-------+          +--------------+

Таким образом, у нас есть три модели: Order, OrderProduct и Product, например:

Order(models.Model):
    email = models.EmailField()

Product(models.Model):
    # ...
    pass

OrderProduct(models.Model):
    order = models.ForeignKey(Order, on_delete=models.CASCADE)
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    quantity = models.IntegerField(default=1)

    class Meta:
        unique_together = ('order', 'product')

Таким образом, мы можем построить заказ как:

product1 = Product.objects.create()
product2 = Product.objects.create()
my_order = Order.objects.create(email='foo@bar.com')
OrderProduct.objects.create(product=product1, order=my_order)
OrderProduct.objects.create(product=product2, order=my_order, quantity=14)

Итак, здесь мы сконструировали два продукта и один заказ и добавили к этому заказу два OrderProduct, один для product1 и один для product2 с количеством 14.

...