2016-08-17 3 views
0

객체 내부의 모든 결정 자식 개체에 대한 계산 받기 :장고 - 검색어 세트 - 모든 부모가 나는이 모델을 가지고

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

내가 다른 장고 쿼리를 사용하여 시도했지만 내가 할 모든 각의 수를 검색하는 할 대신 모든 주문의 수를 주문하십시오.

나는이 작업을 각각 별도로 쿼리하면 쉽게 수행 할 수 있지만 모든 쿼리를 하나만 수행하도록 요청되었음을 알고 있습니다.

답변

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

그런데 annotate 값에 "related_name"과 같은 이름을 지정하면 오류가 반환됩니다. – Guido

+0

맞아요. 정답입니다. 하나의 쿼리 만 사용하고 print (orders.query)를 사용하여 쿼리를 인쇄하고 SQL을 확인할 수 있습니다 –