간단한 장고 모델 고려 Event
와 Participant
:
class Event(models.Model):
title = models.CharField(max_length=100)
class Participant(models.Model):
event = models.ForeignKey(Event, db_index=True)
is_paid = models.BooleanField(default=False, db_index=True)
총 참가자 수로 이벤트 쿼리에 쉽게 주석을 달 수 있습니다.
events = Event.objects.all().annotate(participants=models.Count('participant'))
필터링 된 참가자 수로 주석을다는 방법은 is_paid=True
무엇입니까?
참가자 수에 관계없이 모든 이벤트 를 쿼리해야합니다 . 예를 들어 주석이 달린 결과로 필터링 할 필요가 없습니다. 0
참가자 가 있으면 괜찮습니다 0
. 주석이 달린 값만 있으면됩니다.
문서 의 예제는 여기에서 작동하지 않습니다 0
. 으로 주석을 달지 않고 쿼리에서 개체를 제외하기 때문입니다 .
최신 정보. Django 1.8에는 새로운 조건식 기능 이 있으므로 이제 다음과 같이 할 수 있습니다.
events = Event.objects.all().annotate(paid_participants=models.Sum(
models.Case(
models.When(participant__is_paid=True, then=1),
default=0,
output_field=models.IntegerField()
)))
업데이트 2. Django 2.0에는 새로운 조건부 집계 기능이 있습니다. 아래 에서 허용되는 답변을 참조하십시오.
aggregate
사용법 만 표시됩니다. 이러한 쿼리를 이미 테스트 했습니까? (나는하지 않았고 믿고 싶다! :)