2011-12-12 3 views
2

모델 :장고 집계 및 다음 외래 키 관계

class Item(models.Model): 
    name = models.CharField(max_length=100) 
    # More stuff. 
class Sale(models.Model): 
    sale_date = models.DateField(auto_now_add=True) 
    item = models.ForeignKey(Item) 
    # More stuff. 

보기 :

class TodaySales(ListView): 
    # Stuff in here. 
    def get_queryset(self): 
     sales_today = Sale.objects.filter(sale_date=date.today()) 
     return sales_today.values('item').annotate(Count('item')) 

나는 이런 식으로 뭔가 다시 얻을 :

[{'item': 1, 'item__count': 2}, {'item': 2, 'item__count': 1}] 

이것은 좋은이며 모든 및하지만 정말 그 이름과 같은 항목에 대한 추가 정보를 얻을 수있게되고 싶어요하지만 내가 얻을 수 있기 때문에 쉽게 할 수 없어. 그는 아이템 ID를 가지므로 내 템플릿에서 할 수 없습니다 (예 : {{item.name}}).

이렇게하는 좋은 방법이 있습니까?

답변

4

이 할 것 : 예컨대, 당신의 values 호출에 명시 적으로 이름을 지정할 수 있습니다. 시도해보십시오.

Item.objects.filter(
    sale__sale_date=date.today() 
).annotate(
    count = Count('sale') 
) 
+1

매우 섹시하며 작동합니다. 감사. –

+0

그것은 아름다운 sooo입니다. 내가 1 년 전에 찾았 으면 좋겠던 코드 조각 – Nirri

2

당신이 오히려 판매보다는 항목에서 추가 데이터를 가져 오는 걱정, 당신은 그 클래스에 조회 수 :

values보다는, ORM 객체를 반환
models.Item.objects.filter(sale__sale_date=date.today()).annotate(Count('id')) 

또는 values_list을 : 당신은 것 또한 특정 항목에 대한 판매 수량과 함께 사용할 수있는 합성 id__count 속성이 있어야합니다. 당신은 당신이 원하는 필드를 정확하게 미리 알고있는 경우

또는, 당신은 또한

sales_today.values('item', 'item__name').annotate(Count('item'))