这是我正在开发的eCom网站。我需要根据电子邮件过滤结果,就像获取此电子邮件帐户下的所有订单一样。执行查询OrderItem.objects.filter(order__email='john@john.com').select_related('order')
时,我将获得每个产品的queryset对象。因此,如果一个订单有多个产品,那么每个产品都是一个单独的集合。我需要的是将所有项目组合在一个订单ID中,以便可以在模板中对其进行遍历。
OrderItem.objects.filter(order__email='john@john.com').select_related('order').values('order_id').annotate(ct=Count('pk'))
-此查询获取所有这些ID,并显示每个ID有多少组。同样,我只需要结果,但需要其他字段,例如created_date,order_id,transaction_id,product。
我已经浏览了django文档,但似乎找不到合适的解决方案。另一个选择是手动循环遍历查询集中的每个项目,并基于具有多个项目的order_id进行隔离,但是这似乎并不高效。因此,任何有关如何进行的想法都很棒。
模型如下:
class Order(models.Model):
payment_date = models.DateTimeField(blank=True, null=True)
created_date = models.DateTimeField(auto_now_add=True)
transaction_id = models.CharField(max_length=256, blank=True, null=True)
email = models.EmailField(max_length=128, blank=True, null=True)
def __str__(self):
return "Order #{},Date:{}".format(self.id,self.created_date)
class OrderItem(models.Model):
product = models.ForeignKey(PRODUCT_VARIANT_MODEL, on_delete=models.DO_NOTHING)
quantity = models.IntegerField(default=1)
order = models.ForeignKey(Order, related_name='items', on_delete=models.CASCADE)
def __str__(self):
return "Quantity:{},Item:{},{}".format(self.quantity, self.product.get_product_title(),self.order)
查询1的结果:(此电子邮件ID下了2个订单)OrderItem.objects.filter(order__email='john@john.com').select_related('order')
<QuerySet [<OrderItem: Quantity:3,Item:sampleitem 1,Order #21,Date:2019-06-07 06:14:22.929052+00:00>, <OrderItem: Quantity:1,Item:sampleitem 91,Order #22,Date:2019-06-24 05:33:16.509479+00:00>, <OrderItem: Quantity:2,Item:sampleitem 44,Order
#22,Date:2019-06-24 05:33:16.509479+00:00>, <OrderItem: Quantity:1,Item:sampleitem 8,Order #22,Date:2019-06-24 05:33:16.509479+00:00>]>
查询2的结果:
OrderItem.objects.filter(order__email='john@john.com').select_related('order').values('order_id').annotate(ct=Count('pk'))
<QuerySet [{'order_id': 21, 'ct': 1}, {'order_id': 22, 'ct': 3}]>