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")