2016-08-17 69 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 –

相關問題