Сложный запрос на объект
Итак, у меня есть сайт электронной коммерции, который я создаю. Когда клиент нажимает кнопку "Оформить заказ", сайт создает заказ, и база данных обновляется совершенно нормально. Проблема заключается в отображении сводки заказа. Если клиент уже заказывал у компании в прошлом, этот заказ сохраняется в базе данных вместе с новым. Сайт выдает ошибку "2 объекта возвращены", когда я пытаюсь получить доступ к нему через внешний ключ, который связывает таблицу заказов с таблицей User. Причина этого мне очевидна, поэтому я добавил поле datetime и установил атрибут auto_now_add в TRUE. Проблема, с которой я сталкиваюсь, заключается в выборе последнего заказа для конкретного клиента. Есть ли способ использовать что-то подобное?
user = request.user
Order.objects.filter(Customer=user).date_placed.latest()
Тот факт, что filter() возвращает набор, заставляет меня думать, что sytax не будет выполняться должным образом. Может быть, с помощью цикла for внутри функции, которая принимает User в качестве параметра? Я понятия не имею, как к этому подойти, и решил обратиться к вам. Спасибо вам, ребята.
Вид для запроса:
def orderSummary(request):
context = {}
if request.user.is_authenticated:
owner = request.user.id
user = request.user
cart = Cart.objects.get(cart_owner=owner)
held_items = Order_holding.objects.filter(cart=cart)
new_order = Order(customer=user)
new_order.save()
order = Order.objects.get(customer = user)
for item in held_items:
order_item = Order_item(order=order, blackAndWhite=item.blackAndWhite, product= item.product, color = item.color, gloss=item.gloss, matte=item.matte, size=item.size, notes=item.notes, cuts=item.cuts, grommets=item.grommets, quantity=item.quantity, subtotal=item.subtotal, cart=item.cart)
order_item.save()
item.delete()
order_items = Order_item.objects.filter(cart=cart)
for item in order_items:
order.items.add(item)
order.save()
context['order_items'] = order.items.all()
return render(request, 'order/orderSummary.html', context)
else:
return HttpResponseRedirect(reverse("login"))
Файл order.models.py:
from django.db import models
from django.contrib.auth.models import User
from products.models import Product
from cart.models import Cart
class Order_item(models.Model):
#front_image = models.ImageField()
blackAndWhite = models.BooleanField(default=False)
product = models.ForeignKey(Product, on_delete=models.CASCADE, null=True)
color = models.BooleanField(default=False)
gloss = models.BooleanField(default=False)
matte = models.BooleanField(default=False)
size = models.CharField(null=True, blank=True, max_length=50)
notes = models.CharField(null=True, blank=True, max_length=1000)
cuts = models.IntegerField(null=True, blank=True, max_length=200)
grommets = models.IntegerField(null=True, blank=True, max_length=200)
quantity = models.IntegerField(null=True, blank=True, max_length=200)
cart = models.ForeignKey(Cart, on_delete=models.CASCADE, null=True)
subtotal = models.DecimalField(max_digits=100, decimal_places=2, default=0.00)
class Order(models.Model):
customer = models.ForeignKey(User, on_delete=models.CASCADE)
items = models.ManyToManyField(Order_item, null=True)
time_placed = models.DateTimeField(auto_now_add=True, null=True)
class Order_holding(models.Model):
blackAndWhite = models.BooleanField(default=False)
product = models.ForeignKey(Product, on_delete=models.CASCADE, null=True)
color = models.BooleanField(default=False)
gloss = models.BooleanField(default=False)
matte = models.BooleanField(default=False)
size = models.CharField(null=True, blank=True, max_length=50)
notes = models.CharField(null=True, blank=True, max_length=1000)
cuts = models.IntegerField(null=True, blank=True, max_length=200)
grommets = models.IntegerField(null=True, blank=True, max_length=200)
quantity = models.IntegerField(null=True, blank=True, max_length=200)
cart = models.ForeignKey(Cart, on_delete=models.CASCADE, null=True)
order = models.ForeignKey(Order, on_delete=models.CASCADE, null=True)
subtotal = models.DecimalField(max_digits=100, decimal_places=2, default=0.00)
Я думаю, что вы можете сделать это:
Order.objects.filter(customer=user).latest("time_placed")
Возвращается только один объект.
Попробуйте :
Order.objects.filter(customer=user).order_by('-time_placed')