Как добавить несколько позиций заказа в один заказ

Отказ от ответственности: Я новичок в django и пытаюсь создать магазин покупок

Вот мои models.py

class Service(models.Model):
    name = models.CharField("name",max_length=255)

class Order(models.Model):
    date = models.DateField(auto_now_add=True)
    isDelete = models.BooleanField(default=False)

class OrderItem(models.Model):
    order_id = models.ForeignKey(Order, on_delete=models.CASCADE, null=False)
    service_id = models.ForeignKey(Service, on_delete=models.CASCADE, null=False)
    quantity = models.PositiveIntegerField(null=False)
    price = models.DecimalField(decimal_places=2,max_digits=99, null=False)

Я сделал эту функцию api_view, которая может создать один заказ с одним элементом заказа.

Примечание: у меня нет никаких сериализаторов для этого.

Я запускаю этот api через Postman.

@api_view(['GET', 'POST'])
@csrf_exempt
# class CreteOrderView(View):
def create_order(request, *args, **kwargs):

    if request.method == 'POST':
        
        now = datetime.date.today()
        order = Order.objects.create(date=now)
        order.save()
        orderid = order.id
        order_id = orderid
        orderitems = OrderItem.objects.all().values()
        price = request.POST.get('price')
        quantity = request.POST.get('quantity')
        service_id = request.POST.get('service_id')
        orderitemcreate= OrderItem.objects.create(order_id_id=order_id,
                                            service_id_id=service_id,quantity=quantity,price=price)
        orderitemcreate.save()
        return Response({"Order Created"})
    else:
        order_qs = models.Order.objects.all().values_list()
        OrderItem_qs = models.OrderItem.objects.all().values_list()
        return Response({"Order":str(order_qs),"OrderItem":str(OrderItem_qs)})

Проблемы:

  1. Он принимает данные только через форму данных (но я хочу отправить данные в форме json)

  2. Я хочу добавить несколько позиций заказа в один заказ.

Есть ли какое-нибудь решение для этого?

Ожидаемый вход/выход:

[
    {
        "service_id": 1,
        "quantity": 2
        "price": 20,
    },
    {
        "service_id": 2,
        "quantity": 2
        "price": 20,
    },
    {
        "service_id": 3,
        "quantity": 2
        "price": 20,
    },
]

Прежде всего, необходимо убедиться, что имена переменных имеют одинаковый характер. Иногда используется змеиный регистр, иногда верблюжий, ...

class Service(models.Model):
    name = ...
 
class Order(models.Model):
    date = ...
    is_delete = ...
 
class OrderItem(models.Model):
    order = ...
    service = ...
    quantity = ...
    price = ...

Что такое Order.is_delete? Я думаю, что ОП захочет вместо этого что-то под названием is_paid? (Чтобы проверить, был ли заказ оплачен или нет.)

В любом случае...

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

В данном случае все иначе... ОП хочет, чтобы функция запрашивала у пользователя конкретные данные, позволяющие ему

  1. Создать экземпляр заказа
  2. Создайте экземпляры OrderItem, используя определенный экземпляр Заказа и Службы

Я хочу добавить несколько позиций заказа в один заказ.

Как OP узнает, какие товары пользователь размещает в заказе? Нет никакого способа узнать это с вашей текущей функцией.

Он должен запросить у пользователя конкретные данные, которые позволят ОП сделать это.

Тогда ОП может создать OrderItems

OrderItem.objects.create(order=order, service=...)

Кроме того, вы уверены, что ожидаемый вход/выход правильный? Он не включает заказ банкомата.

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