2012-08-27 21 views
7

xem xét truy vấn này:Trong django, có cách nào để trực tiếp chú thích một truy vấn với một đối tượng liên quan trong truy vấn đơn lẻ không?

query = Novel.objects.< ...some filtering... >.annotate(
    latest_chapter_id=Max("volume__chapter__id") 
) 

Trên thực tế những gì tôi cần là chú thích mỗi Novel với đối tượng mới nhất của nó Chapter, vì vậy sau khi truy vấn này, tôi phải thực hiện truy vấn khác để chọn đối tượng thực tế bằng ID được chú thích. IMO điều này là xấu xí. Có cách nào để kết hợp chúng thành một truy vấn không?

+0

Thay vào đó, bạn có thể chú thích các chương bằng tiểu thuyết không? –

+0

Có vẻ như không thể với tôi, bởi vì tôi chỉ cần chương mới nhất cho mỗi cuốn tiểu thuyết, nhưng một cuốn tiểu thuyết có nhiều chương, và các chương có số lượng khác nhau. Theo như tôi biết 'khác biệt()' là vô ích trong trường hợp này (đúng với tôi nếu tôi sai), và tôi không biết cách nào khác để chọn chính xác một chương trừ khi bắt đầu từ tiểu thuyết. Bất kỳ ý tưởng? – SAPikachu

Trả lời

2

Không, không thể kết hợp chúng thành một truy vấn.

Bạn có thể đọc blog post sau để tìm hai giải pháp thay thế.

+2

Câu trả lời của rune-kaagaard là tốt hơn bây giờ. – qznc

+1

Bài đăng được liên kết đề xuất sử dụng thêm() trong truy vấn. Kể từ Django 1.8, extra() không được khuyến nghị và không được dùng nữa. – johanno

15

Có, có thể.

Để có được một queryset chứa tất cả các chương mà là người cuối cùng trong tiểu thuyết của họ, chỉ cần làm:

from django.db.models.expressions import F 
from django.db.models.aggregates import Max 

Chapters.objects.annotate(last_chapter_pk=Max('novel__chapter__pk') 
      ).filter(pk=F('last_chapter_pk')) 

Thử nghiệm trên Django 1.7.

Các vấn đề liên quan