मैं किसी ऑब्जेक्ट में एक संपत्ति जोड़ने के लिए एनोटेट का उपयोग कर रहा हूं जिसे मैं order_by के लिए उपयोग कर सकता हूं। हालांकि, मैं एक संबंध के संबंध में एक क्षेत्र पर टिप्पणी करना चाहता हूं। मुझे पता है कि मैं किसी भी तरह डबल-अंडरस्कोर नोटेशन का उपयोग कर मैदान में पहुंचने में सक्षम होना चाहिए, लेकिन मैं बस इसके चारों ओर अपने सिर को लपेट नहीं सकता।Django: संबंधित क्षेत्र के संबंधित क्षेत्र पर order_by कैसे करें
यहाँ मॉडल हैं:
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)
तो, एक चर्चा वैकल्पिक रूप से एक समूह के साथ जुड़ा हो सकता है, और DiscussionResponses एक चर्चा के साथ जुड़े रहे हैं। मैं जो करना चाहता हूं वह समूह से जुड़े किसी भी चर्चा पर सबसे हालिया चर्चा रिस्पॉन्स पाता है, यदि यह मौजूद है, और उसके द्वारा क्रमबद्ध करें।
मैं जहाँ तक इस रूप में मिल गया है:
Group.objects.filter(some_filtering).distinct().annotate(
last_response=Max('some__reverse__relationship__timestamp').order_by(
'-last_response')
मैं सिर्फ इस मामले में एक DiscussionResponse पर टाइमस्टैम्प को पाने के लिए सही तरीके से यह पता लगाने की नहीं कर पा रहे।
अद्यतन: आप वास्तव में एक एनोटेटेड मूल्य द्वारा ऑर्डर कर सकते हैं। यहाँ एक संबंधित चर्चा का टाइमस्टैम्प पर एक order_by
साथ एक उदाहरण है:
>>> 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)
इस मामले में, केवल समूह # 2 चर्चाओं से संबंधित है तो यह शीर्ष करने के लिए ले जाया गया था; बाकी प्राकृतिक आदेश बनाए रखें। मैं वास्तव में क्या करना चाहूंगा, ऐसे समूहों को स्थानांतरित करें जिनके पास हालिया प्रतिक्रियाएं पर चर्चा के शीर्ष पर चर्चा के लिए प्रतिक्रियाएं हैं। यही कारण है कि मैंने सोचा कि 'discussion__discussionresponse__timestamp'
काम करेगा, लेकिन ऐसा प्रतीत नहीं होता है।
मैं निम्नलिखित की कोशिश की है, जिनमें से कोई भी काम: 'discussion__discussionresponse__timestamp',' discussion_set__discussionresponse__timestamp', और 'चर्चा set__discussionresponse__timestamp' – foresmac
मुझे समझ में नहीं आता कि आप क्या करने का प्रयास करते हैं। उदाहरण के लिए, आप 'last_response = अधिकतम (...) 'घोषित करते हैं जो आपको टाइमस्टैम्प देगा, और फिर आप इस मान को ऑर्डर करते हैं, आपको कॉलम द्वारा ऑर्डर करना होगा, मूल्य नहीं, क्या मैं सही हूँ? आप क्या चाहते हैं टाइमस्टैम्प कोलम द्वारा आदेश है ?? –
आप एक एनोटेटेड मान पर 'order_by' कर सकते हैं; मैंने पहले चाल का उपयोग किया है। समस्या यह है कि, मुझे समूह से संबंधित चर्चाओं से संबंधित चर्चा रिस्पॉन्स के टाइमस्टैम्प पर नहीं लग रहा है। – foresmac