2013-05-16 31 views
7

Tôi đang sử dụng chú thích để thêm thuộc tính vào đối tượng mà sau đó tôi có thể sử dụng cho order_by. Tuy nhiên, tôi muốn chú thích trên một trường của một quan hệ trên một quan hệ. Tôi biết tôi sẽ có thể đến được cánh đồng bằng cách nào đó bằng cách sử dụng ký hiệu gạch dưới đôi, nhưng tôi dường như không thể quấn quanh đầu tôi được.Django: cách order_by trên trường có liên quan của trường có liên quan

Dưới đây là các mô hình:

class Group(Taggable, Uploadable): 
    name   = models.CharField(max_length=250, db_index=True) 
    description  = models.TextField(max_length=5000, null=True, 
         blank=True, db_index=True) 
    private   = models.BooleanField(default=False) 
    members   = models.ManyToManyField(User, null=True, 
         related_name='members', through='GroupToUser') 
    pending_members = models.ManyToManyField(User, null=True, 
         related_name='pending_members') 
    admin   = models.ForeignKey(User, null=True) 
    timestamp  = models.DateTimeField(auto_now_add=True) 
    author   = models.ForeignKey(User, related_name='author') 

class Discussion(Taggable, Uploadable): 
    author  = models.ForeignKey(User) 
    title  = models.CharField(max_length=250, db_index=True) 
    description = models.TextField(max_length=5000, null=True, 
        blank=True, db_index=True) 
    group  = models.ForeignKey(Group, null=True) 
    timestamp = models.DateTimeField(auto_now_add=True) 

class DiscussionResponse(Uploadable): 
    author  = models.ForeignKey(User) 
    discussion = models.ForeignKey(Discussion) 
    message = models.TextField(max_length=5000) 
    timestamp = models.DateTimeField(auto_now_add=True) 

Vì vậy, một thảo luận có thể tùy chọn được liên kết với một nhóm, và DiscussionResponses có liên quan đến một cuộc thảo luận. Những gì tôi muốn làm là tìm Thảo luận mới nhất về bất kỳ cuộc thảo luận nào được kết nối với một Nhóm, nếu có, và sắp xếp theo đó.

tôi đã nhận được như xa như thế này:

Group.objects.filter(some_filtering).distinct().annotate(
    last_response=Max('some__reverse__relationship__timestamp').order_by(
     '-last_response') 

Tôi chỉ dường như không thể tìm ra con đường đúng để có được dấu thời gian trên một DiscussionResponse trong trường hợp này.

CẬP NHẬT: Bạn thực sự có thể đặt hàng theo giá trị được chú thích. Dưới đây là một ví dụ với một order_by trên dấu thời gian của một cuộc thảo luận liên quan:

>>> groups = Group.objects.all().annotate(
     last_response=Max('discussion__timestamp')).order_by('-last_response') 
>>> for group in groups: 
...  print(group.id, group.last_response) 
...  
... 
(2L, datetime.datetime(2013, 5, 8, 15, 32, 31)) 
(1L, None) 
(3L, None) 
(4L, None) 
(6L, None) 
(7L, None) 
(8L, None) 
(9L, None) 

Trong trường hợp này, chỉ có nhóm # 2 đã liên quan đến các cuộc thảo luận như vậy nó đã được chuyển đến đầu; phần còn lại giữ lại trật tự tự nhiên. Tuy nhiên, điều tôi thực sự muốn làm là di chuyển các nhóm có các câu trả lời gần đây cho các cuộc thảo luận được chuyển lên đầu danh sách. Đó là lý do tại sao tôi nghĩ rằng 'discussion__discussionresponse__timestamp' sẽ làm việc, nhưng nó không có vẻ.

+0

Tôi đã thử những điều sau đây, không ai trong số đó làm việc: 'discussion__discussionresponse__timestamp',' discussion_set__discussionresponse__timestamp', và 'discussion set__discussionresponse__timestamp' – foresmac

+0

Tôi không hiểu những gì bạn cố gắng hoàn thành. Ví dụ, bạn khai báo 'last_response = Max (...)' sẽ cung cấp cho bạn một dấu thời gian, và sau đó bạn order_by giá trị này, bạn phải sắp xếp theo cột, không phải là một giá trị, tôi có đúng không? Những gì bạn muốn là thứ tự của dấu thời gian colum ?? –

+0

Bạn có thể 'order_by' trên một giá trị được chú thích; Tôi đã sử dụng lừa trước đây. Vấn đề là, tôi dường như không thể có được dấu thời gian của các DiscussionResponses liên quan đến các thảo luận liên quan đến một nhóm. – foresmac

Trả lời

1

Ok, rõ ràng là chỉ 'discussion__discussionresponse__timestamp'. Tôi đã thử nó trong vỏ Django và nó đã không làm việc sau khi tiết kiệm một DiscussionResponse mới, nhưng nó đã làm việc vài phút sau khi tôi đã thử nó một lần nữa:

>>> groups = Group.objects.all().annotate(last_response=Max(
     'discussion__discussionresponse__timestamp')).order_by('-last_response') 
>>> for group in groups: 
...  print(group.id, group.last_response) 
...  
... 
(2L, datetime.datetime(2013, 5, 16, 14, 56, 22)) 
(1L, None) 
(3L, None) 
(4L, None) 
(6L, None) 
(7L, None) 
(8L, None) 
(9L, None) 
>>> 

Nếu có ai biết tại sao nó không làm việc ngay sau khi tiết kiệm một đối tượng mới cho cơ sở dữ liệu, nhưng đã làm việc sau đó, đó có lẽ sẽ là thông tin hữu ích.

Đây là một chạy vào truy vấn với các cuộc thảo luận/phản ứng thêm vào nhóm khác chỉ để xác minh thêm:

>>> groups = Group.objects.all().annotate(last_response=Max('discussion__discussionresponse__timestamp')).order_by('-last_response') 
>>> for group in groups: 
...  print(group.id, group.last_response) 
...  
... 
(4L, datetime.datetime(2013, 5, 16, 15, 25, 40)) 
(2L, datetime.datetime(2013, 5, 16, 15, 16, 46)) 
(1L, None) 
(3L, None) 
(6L, None) 
(7L, None) 
(8L, None) 
(9L, None) 
>>> 
+0

Vui lòng đánh dấu là đã trả lời. – stellarchariot

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