Get() возвращает более одного OrderProduct - возвращает 3

Моя ошибка:

MultipleObjectsReturned at /process/

get() возвращает более одного OrderProduct - возвращает 3!

Метод запроса: POST URL запроса: http://127.0.0.1:8000/process/. Версия Django: 4.0.4 Тип исключения: MultipleObjectsReturned

Значение исключения:
get() вернул более одного OrderProduct - он вернул 3! Расположение исключения: C:\Users\User\AppData\Roaming\Python\Python310\site-packages\django\db\models\query.py, строка 499, in get

Исполняемый файл Python: C:\Program Files\Python310\python.exe Версия Python: 3.10.4

Python Path:
['D:\Online_Shop_Django', 'C:\Program Files\Python310\python310.zip', 'C:\Program Files\Python310\DLLs', 'C:\Program Files\Python310\lib', 'C:\Program Files\Python310', 'C:\Users\User\AppData\Roaming\Python\Python310\site-packages', 'C:\Program Files\Python310\lib\site-packages']

Время сервера: Thu, 26 May 2022 16:57:38 +0500

Мои взгляды:

 if not request.user.is_authenticated:
    session = request.session
    cart = session.get(settings.CART_SESSION_ID)
    del session['cart']
else:
    customer = request.user.customer
    order, created = Order.objects.get_or_create(
        customer=customer, complete=False)

    order_product, created = OrderProduct.objects.get_or_create(
        order=order, )
    order.save()
messages.success(request, 'Заказ успешно оформлен. Проверьте свою электронную почту!!!')
return redirect('product_list')

как я могу решить эту проблему? Пожалуйста, помогите мне

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

Использовать .filter().first()

.filter() + .first() можно использовать для потока управления вместо .get().

if not request.user.is_authenticated:
    session = request.session
    cart = session.get(settings.CART_SESSION_ID)
    del session["cart"]
else:
    customer = request.user.customer
    order, created = Order.objects.get_or_create(customer=customer, complete=False)

    order_product = OrderProduct.objects.filter(order=order).first()

    if order_product is None:
        order_product = OrderProduct(order=order)
        order_product.save()
    order.save()
messages.success(request, "Заказ успешно оформлен. Проверьте свою электронную почту!!!")
return redirect("product_list")

.get_or_create() / .get(): Обработка ошибок

get_or_create - это просто обертка для .get().

MultipleObjectsReturned является исключением, которое вы можете обработать через try / except.

if not request.user.is_authenticated:
    session = request.session
    cart = session.get(settings.CART_SESSION_ID)
    del session["cart"]
else:
    customer = request.user.customer
    order, created = Order.objects.get_or_create(customer=customer, complete=False)

    try:
        order_product, created = OrderProduct.objects.get_or_create(order=order)
    except OrderProduct.MultipleObjectsReturned:
        # You would need to decide what you want to do here
        print(f'Multiple objects returned for {order}')
    order.save()
messages.success(request, "Заказ успешно оформлен. Проверьте свою электронную почту!!!")
return redirect("product_list")
Вернуться на верх