2016-08-17 63 views
0

我有了这个模型:Django的 - 查询集 - 获取计数确定所有子对象中的所有对象的父

class Order(models.Model): 
    #bunch of fields# 

class Laptop(models.Model): 
    #bunch of fields# 

class Camera(models.Model): 
    #bunch of fields# 

class MusicPlayer(models.Model): 
    #bunch of fields# 

最后三个有相关的Order类的外键。 我需要通过QuerySet检索所有订单的每个子对象的总计数,并按照它们中的每一个进行分组。

结果应该是这个样子: 笔记本电脑:5 摄像头:10 MusicPlayer:1

我使用不同的Django的查询尝试,但我得到的就是修正各计数订单而不是所有订单的计数。

我知道这可以很容易地通过单独查询每个人来完成,但我被要求在一个查询中完成所有操作。

回答

1

添加related_name到模型:

class Laptop(models.Model): 
    order = models.ForeignKey(Order, related_name='laptops') 

class Camera(models.Model): 
    order = models.ForeignKey(Order, related_name='cameras') 

class MusicPlayer(models.Model): 
    order = models.ForeignKey(Order, related_name='music_players') 

然后你就可以使用annotateCount检索相关车型的数量:

from django.db.models import Count 

orders = Order.objects.annotate(laptops_count=Count('laptops'), cameras_count=Count('cameras'), music_players_count=Count('music_players')) 
print(orders.laptops_count) 
print(orders.cameras_count) 
print(orders.music_players_count) 
+0

感谢您的评论!由于您试图直接从订单对象访问笔记本电脑,它将返回一个AttributeError。这是我遇到的同样的问题,我不想逐个访问所有对象(例如:orders [0])以访问计数。 – Guido

+0

顺便说一句,赋予注释值与“related_name”相同的名称它返回错误 – Guido

+0

你是对的我修复了答案。它只使用一个查询,可以使用print(orders.query)打印查询并检查SQL –