2009-01-17 36 views
5
class Message(models.Model): 
    subject = models.CharField(max_length=100) 
    pub_date = models.DateTimeField(default=datetime.now()) 

class Topic(models.Model): 
    title = models.CharField(max_length=100) 
    message = models.ManyToManyField(Message, verbose_name='Discussion') 

Tôi muốn nhận đơn đặt hàng tất cả các chủ đề theo đối tượng tin nhắn mới nhất gắn liền với chủ đề đó. Tôi đã thực hiện truy vấn này nhưng điều này không cung cấp cho bộ truy vấn riêng biệt.Phân biệt API truy vấn() không hoạt động?

>> Topic.objects.order_by('-message__pub_date').distinct() 
+0

Câu hỏi này dường như chưa hoàn chỉnh. Việc sử dụng .distinct() mà bạn nghĩ không hoạt động ở đâu? (Nó hoạt động, nhân tiện). –

+0

Vâng! chính xác, tôi đã bỏ lỡ nó! Tôi đã thêm ngay bây giờ! – aatifh

Trả lời

3

Bạn sẽ tìm thấy giải thích trong số documentation for .distinct().

Tôi sẽ không chuẩn hóa bằng cách thêm trường modified_date vào mô hình Topic và cập nhật mô hình đó bất cứ khi nào một Tin nhắn được lưu hoặc xóa.

7

Bạn không cần phân biệt() ở đây, những gì bạn cần là aggregation. Truy vấn này sẽ làm những gì bạn muốn:

from django.db.models import Max 
Topic.objects.annotate(Max('message__pub_date')).order_by('-message__pub_date__max') 

Mặc dù nếu điều này là mã sản xuất, có thể bạn sẽ muốn làm theo lời khuyên akaihola và denormalize "last_message_posted" vào mô hình Topic trực tiếp.

Ngoài ra, có lỗi trong giá trị mặc định của bạn cho Message.pub_date. Như bạn có nó bây giờ, bất cứ khi nào bạn chạy máy chủ đầu tiên và mã này được nạp, datetime.now() sẽ được thực hiện một lần và giá trị đó sẽ được sử dụng làm pub_date cho tất cả các Tin nhắn. Thay vào đó, hãy sử dụng thông tin này để chuyển chính cuộc gọi đó cho đến khi mỗi Thông báo được tạo:

pub_date = models.DateTimeField(default=datetime.now) 
Các vấn đề liên quan