Hãy xem xét các mô hình Django đơn giản Event
và 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ó 0
người tham gia, đó là ok, tôi chỉ cần 0
trong 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.
aggregate
cá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! :)