Hãy xem xét các mô hình Django đơn giản Eventvà 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)
Thật dễ dàng để chú thích truy vấn sự kiện với tổng số người tham gia:
events = Event.objects.all().annotate(participants=models.Count('participant'))
Làm cách nào để chú thích với số lượng người tham gia được lọc theo is_paid=True?
Tôi cần truy vấn tất cả các sự kiện bất kể số lượng người tham gia, ví dụ: tôi không cần lọc theo kết quả có chú thích. Nếu có 0người tham gia, đó là ok, tôi chỉ cần 0trong giá trị chú thích.
Các ví dụ từ tài liệu không làm việc ở đây, bởi vì nó không bao gồm các đối tượng từ truy vấn thay vì chú thích chúng với 0.
Cập nhật. Django 1.8 có tính năng biểu thức điều kiện mới , vì vậy bây giờ chúng ta có thể làm như sau:
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()
)))
Cập nhật 2. Django 2.0 có tính năng tổng hợp có Điều kiện mới , hãy xem câu trả lời được chấp nhận bên dưới.
aggregatecách sử dụng được hiển thị. Bạn đã thử nghiệm các truy vấn như vậy chưa? (Tôi chưa và tôi muốn tin! :)