ลองพิจารณาโมเดล Django แบบง่ายๆ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
คำอธิบายประกอบ
เช่นจากเอกสารไม่ได้ทำงานที่นี่เพราะมันไม่รวมวัตถุจากแบบสอบถามแทน annotating 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
การใช้งานเท่านั้น คุณได้ทดสอบคำถามดังกล่าวแล้วหรือยัง? (ฉันไม่ได้และฉันอยากจะเชื่อ! :)