合并具有相似值的Django queryset对象

时间:2019-07-06 06:09:30

标签: python django

这是我正在开发的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}]>

0 个答案:

没有答案