Проблема фильтрации CartOrderItems по поставщику с помощью Django ORM
Я столкнулся с проблемой фильтрации CartOrderItems
по Vendor
с помощью ORM Django. Вот сценарий и проблема, с которой я столкнулся:
1.Сценарий:
У меня есть Django-приложение, в котором продавцы могут загружать товары (модель Product
) и управлять своими заказами (модели CartOrderItems
и CartOrder
).
2.Цель:
Я хочу получить заказы (CartOrder
экземпляры), связанные с товарами, загруженными текущим продавцом (request.user
).
3Текущий подход:
В моей функции представления vendor_pannel1
я пытаюсь достичь этого следующим образом:
@login_required
def vendor_pannel1(request):
# Get products uploaded by the current vendor (user)
vendor_products = Product.objects.filter(user=request.user)
# Get the vendor IDs associated with these products
vendor_ids = vendor_products.values_list("vendor_id", flat=True)
# Get CartOrderItems related to those vendors
order_items = CartOrderItems.objects.filter(vendor_id__in=vendor_ids)
# Get orders related to those CartOrderItems
orders = CartOrder.objects.filter(cartorderitems__in=order_items).distinct()
context = {
"orders": orders,
}
return render(request, "vendorpannel/dashboard.html", context)
- Проблема: Ничего не фильтрует.
5.Ожидаемый результат:
Я ожидаю получить заказы (CartOrder
экземпляры), связанные с товарами, загруженными текущим продавцом (request.user
).
6.Мои модели:
class CartOrder(models.Model):
user=models.ForeignKey(CustomUser,on_delete=models.CASCADE)
item=models.CharField(max_length=100)
price= models.DecimalField(max_digits=10, decimal_places=2,default="1.99")
paid_status=models.BooleanField(default=False)
order_date=models.DateTimeField(auto_now_add=True)
product_status=models.CharField(choices=STATUS_CHOICE, max_length=30,default="processing")
class Meta:
verbose_name_plural="Cart Order"
class CartOrderItems(models.Model):
user = models.ForeignKey(CustomUser, on_delete=models.CASCADE)
vendor = models.ForeignKey(Vendor,on_delete=models.CASCADE,default=1)default
order=models.ForeignKey(CartOrder,on_delete=models.CASCADE)
# product = models.ForeignKey(Product, on_delete=models.CASCADE, default=1) #please dont't ignore it
invoice_num = models.BigIntegerField(blank=True,null=True)
product_status=models.CharField(max_length=200)
item=models.CharField(max_length=100)
image=models.CharField(max_length=100)
qty=models.BigIntegerField(default=0)
price= models.DecimalField(max_digits=12, decimal_places=2,default="15")
total= models.DecimalField(max_digits=12, decimal_places=2,default="20")
color=models.ForeignKey(Color,on_delete=models.SET_NULL,null=True,blank=True)
size=models.ForeignKey(Size,on_delete=models.SET_NULL,null=True,blank=True)
class Meta:
verbose_name_plural="Cart Order Items"
def catagory_image(self):
return mark_safe('<img src="%s" width="50" height="50"/>'%(self.image.url))
def oder_img(self):
return mark_safe('<img src="/media/%s" width="50" height="50"/>'%(self.image))
7.Что я пробовал:
Я пробовал изменять условия фильтрации (vendor__in=vendor_products
) и исследовать другие методы Django ORM, но так и не смог решить проблему.
Request:
Подскажите, пожалуйста, как правильно фильтровать CartOrderItems по Vendor с помощью Django ORM в контексте структуры моего приложения?
В вашей модели CartOrderItems отсутствует related_name в поле order. Поэтому используйте related_name в поле order следующим образом:
order=models.ForeignKey(CartOrder,on_delete=models.CASCADE, related_name="cartorderitems")
Или
Используйте стандартное имя_родственника, которое django предоставляет для отношений foreign_key. Для получения официальной документации нажмите здесь:
orders = CartOrder.objects.filter(cartorderitems_set__in=order_items).distinct()
Если это решение не работает, пожалуйста, поделитесь моделью продукта и пользователя. А также уточните, как поставщик связан с пользователем?