TypeError: 'RelatedManager' ऑब्जेक्ट चलने योग्य नहीं है


85

Django

मेरे पास अगले मॉडल हैं:

class Group(models.Model):
    name = models.CharField(max_length=100)
    parent_group = models.ManyToManyField("self", blank=True)

    def __unicode__(self):
        return self.name


class Block(models.Model):

    name = models.CharField(max_length=100)
    app = models.CharField(max_length=100)
    group = models.ForeignKey(Group)

    def __unicode__(self):
        return self.name

कहते हैं, ब्लॉक बी 1 है G1 समूह। इसके नाम से मैं समूह g1 से सभी ब्लॉक प्राप्त करना चाहता हूं । मैंने अगला पुनरावर्ती कार्य लिखा:

def get_blocks(group):

    def get_needed_blocks(group):
        for block in group.block_set:
            blocks.append(block)

        if group.parent_group is not None:
            get_needed_blocks(group.parent_group)

    blocks = []
    get_needed_blocks(group)
    return blocks

लेकिन b1.group.block_set मुझे संबंधित प्रबंधक ऑब्जेक्ट लौटाता है, जो चलने योग्य नहीं है।

क्या करें? क्या गलत है?

जवाबों:


175

इसे इस्तेमाल करे:

block in group.block_set.all()

9
क्या किसी को पता है कि संबंधित प्रबंधक को चलने योग्य क्यों नहीं बनाया गया है? मुझे उम्मीद है कि यह इस तरह से होगा ...
stalepretzel

2
यह टिप्पणी थोड़ी देर की है, लेकिन तर्क यह है कि आप db में एक फ़िंच करने से पहले क्वेरी को प्रतिबंधित करने के लिए प्रबंधक पर फ़िल्टरिंग विधियों का उपयोग कर सकते हैं।
२०'१५ को १५:४५ पर ओवलेंग

8
@stalepretzel, क्योंकि यह बिल्कुल एक मानक django प्रबंधक के रूप में काम करता है। आप Model.objects पर कॉल न करें और उस पर पुनरावृति करें। आप Model.objects.all () कहते हैं और फिर आप इसे पुन: व्यवस्थित करते हैं। Django प्रबंधक = / = Django क्वेरीसेट।
शनि नक्षत्र

और यदि आप पाश के लिए एक टेम्पलेट में प्रयोग कर रहे हैं आप {% वस्तु के लिए objects.other_object_set.all% में} कर सकते हैं
ब्रूस

@stalepretzel ... खासकर जब से इसे एक "block_SET" कहा जाता है - और "block_relatedmanager" नहीं। या "block_set_relatedmanager"।
क्लॉस

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.