Có thể lọc trong một chú thích không?Chú thích Django với bộ lọc lồng nhau
Trong một cái gì đó tâm trí của tôi như thế này (mà không thực sự làm việc)
Student.objects.all().annotate(Count('attendance').filter(type="Excused"))
Bảng kết quả sẽ có mỗi học sinh với số lượng vắng mặt có phép. Nhìn qua bộ lọc tài liệu chỉ có thể là trước hoặc sau chú thích sẽ không mang lại kết quả mong muốn.
Một cách giải quyết là này
for student in Student.objects.all():
student.num_excused_absence = Attendance.objects.filter(student=student, type="Excused").count()
này hoạt động nhưng không nhiều truy vấn, trong một ứng dụng thực tế này có thể nhận được không thực tế dài. Tôi nghĩ rằng loại tuyên bố này có thể trong SQL nhưng muốn ở lại với ORM nếu có thể. Tôi thậm chí đã cố gắng thực hiện hai truy vấn riêng biệt (một cho tất cả học sinh, một truy vấn khác để lấy tổng số) và kết hợp chúng với |. Sự kết hợp thay đổi tổng :(
Vài suy nghĩ sau khi câu trả lời đọc và bình luận của
tôi giải quyết vấn đề tham dự sử dụng thêm sql here.
- Timmy's blog post là hữu ích. Câu trả lời của tôi là dựa tắt của nó.
- câu trả lời của hash1baby hoạt động nhưng có vẻ phức tạp như sql.Nó cũng yêu cầu thực thi sql sau đó thêm kết quả trong vòng lặp for.Điều này là xấu đối với tôi vì tôi đang sắp xếp nhiều truy vấn lọc này cùng nhau. queryset w ith rất nhiều bộ lọc và thêm và thực hiện tất cả cùng một lúc.
- Nếu hiệu suất không có vấn đề gì - tôi đề nghị vòng lặp for hoạt động xung quanh. Nó dễ hiểu nhất.
Tôi đã viết một bài đăng blog về điều này vì nó không thể (afaik) mà không cần sử dụng SQL thô hoặc chỉ đơn giản là lặp lại trên các kết quả: http://timmyomahony.com/blog/filtering-annotations-django/ –
Có một giải pháp mới cho điều này trong ORM như của Django 1.8. Xem câu trả lời của tôi dưới đây. – gordonc