2013-05-16 11 views
7

मैं किसी ऑब्जेक्ट में एक संपत्ति जोड़ने के लिए एनोटेट का उपयोग कर रहा हूं जिसे मैं 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' काम करेगा, लेकिन ऐसा प्रतीत नहीं होता है।

+0

मैं निम्नलिखित की कोशिश की है, जिनमें से कोई भी काम: 'discussion__discussionresponse__timestamp',' discussion_set__discussionresponse__timestamp', और 'चर्चा set__discussionresponse__timestamp' – foresmac

+0

मुझे समझ में नहीं आता कि आप क्या करने का प्रयास करते हैं। उदाहरण के लिए, आप 'last_response = अधिकतम (...) 'घोषित करते हैं जो आपको टाइमस्टैम्प देगा, और फिर आप इस मान को ऑर्डर करते हैं, आपको कॉलम द्वारा ऑर्डर करना होगा, मूल्य नहीं, क्या मैं सही हूँ? आप क्या चाहते हैं टाइमस्टैम्प कोलम द्वारा आदेश है ?? –

+0

आप एक एनोटेटेड मान पर 'order_by' कर सकते हैं; मैंने पहले चाल का उपयोग किया है। समस्या यह है कि, मुझे समूह से संबंधित चर्चाओं से संबंधित चर्चा रिस्पॉन्स के टाइमस्टैम्प पर नहीं लग रहा है। – foresmac

उत्तर

1

ठीक है, जाहिर है कि यह 'discussion__discussionresponse__timestamp' है। मैं Django खोल में यह कोशिश की और यह एक नया DiscussionResponse बचाने के बाद काम नहीं किया है, लेकिन यह कई मिनट बाद काम किया जब मैं इसे फिर से करने की कोशिश की:

>>> 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) 
>>> 

किसी को भी जानता है कि ऐसा क्यों सहेजने के बाद सही काम नहीं किया डेटाबेस के लिए एक नई वस्तु, लेकिन बाद में काम किया, शायद यह उपयोगी जानकारी होगी।

यहाँ एक और समूह में जोड़े गए विचार विमर्श/प्रतिक्रियाओं ही में जोड़े गए सत्यापन के लिए साथ क्वेरी में एक और रन है:

>>> 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

उत्तर के रूप में चिह्नित करने के लिए स्वतंत्र महसूस करें। – stellarchariot

संबंधित मुद्दे