Как динамически добавлять поля с добавлением нового продукта в поле ManyToMany - PullRequest
1 голос
/ 10 июля 2019

Я пытаюсь создать систему управления Ресторанным заказом на основе django

, когда кто-то заказывает некоторые виды продуктов, он может заказать 3 пиццы с 2 бутербродами, как позволить клиенту определить количество каждогопродукт, а затем рассчитайте с его ценами

class Restaurant(models.Model):
    name = models.CharField(max_length=50)
    price = models.PositiveIntegerField(default=1)


    def __str__(self):
        return self.name

class Topping(models.Model):
    name = models.CharField(max_length=50)
    product_names = models.ManyToManyField(Restaurant, blank=True)
    quantity = models.PositiveIntegerField(default=1)

общую стоимость заказов, например, для одного продукта: одна пицца с одним бутербродом, однако они заказывают более одной пиццы и бутерброд

    @property
    def total(self):  
        return self.product_names.aggregate(Sum('price'))['price__sum'] 

Я ожидал предоставить поле количества для каждого выбранного элемента: пицца: 3, бутерброд: 2, а затем рассчитать их (3 * цена пиццы, 2 * цена бутерброда)

Ответы [ 2 ]

0 голосов
/ 10 июля 2019

Создайте модель ProductQuantity, которая будет иметь продукт и количество

class ProductQuantity(models.Model):
    id = models.AutoField(primary_key=True)
    product = models.ForeignKey(Restaurant, on_delete=models.CASCADE)
    quantity = models.PositiveIntegerField(default=1)

Затем создайте модель Order, которая будет иметь ManyToManyField ссылку на ProductQuantity

class Order(models.Model):
   id = models.AutoField(primary_key = True)
   products = models.ManyToManyField(ProductQuantity)

   @property
   def total():
       return sum([element.product.price * element.product.quantity for element in self.products.all()])

Таким образом, каждый элемент Order будет иметь список продуктов, а каждый продукт будет иметь продукт и количество.

0 голосов
/ 10 июля 2019

Вы должны построить through=... модель [Джанго-док] в ManyToManyField [Джанго-док], как:

from django.db import models
from django.db.models import <b>F, Sum</b>

class Product(models.Model):
    name = models.CharField(max_length=50)
    price = models.PositiveIntegerField(default=1)

    def __str__(self):
        return self.name

class Order(models.Model):
    name = models.CharField(max_length=50)
    products = models.ManyToManyField(Product, <b>through='ProductOrder'</b>)

    @property
    def total(self):  
        return self.productorder_set.aggregate(
            <b>price_sum=Sum(F('quantity') * F('product__price'))</b>
        )['price_sum'] 

class <b>ProductOrder</b>(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    order = models.ForeignKey(Order, on_delete=models.CASCADE)
    quantity = models.IntegerField(default=1)

A ProductOrder, таким образом, является записью в отношении «многие ко многим», поэтому оно означает, что product является частью этого order с данным quantity.

Затем мы можем рассчитать общую цену с помощью Sum(F('quantity') * F('product__price')), поэтому сумма количества этих записей умножится на цену соответствующего продукта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...