প্রকারের ত্রুটি: 'সম্পর্কিত ম্যানেজার' অবজেক্টটি পুনরাবৃত্ত হয় না


87

জ্যাঙ্গো

আমার পরবর্তী মডেল রয়েছে:

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 এর জি 1 গ্রুপ রয়েছে। এর নামে আমি গ্রুপ জি 1 থেকে সমস্ত ব্লক পেতে চাই । আমি পরবর্তী পুনরাবৃত্তির কাজ লিখেছি:

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 আমাকে সম্পর্কিতম্যানেজার অবজেক্টটি ফিরিয়ে দেয় , যা পুনরাবৃত্তিযোগ্য নয়।

কি করো? কোনো সমস্যা?

উত্তর:


180

এটা চেষ্টা কর:

block in group.block_set.all()

9
কেউ কি জানে যে রিলেটেড ম্যানেজারটি পুনরাবৃত্তিযোগ্য হয় না? আমি আশা করতাম এটি
সেভাবেই হবে

4
এই মন্তব্যটি একটু দেরীতে হলেও যুক্তিটি হ'ল আপনি ডিবিতে আনার আগে ক্যোয়ারিকে সীমাবদ্ধ করতে ম্যানেজারের মধ্যে ফিল্টারিং পদ্ধতিগুলি ব্যবহার করতে পারেন।
ওভ্যাঙ্গেল

8
@ স্টলেটারিয়েজেল, কারণ এটি স্ট্যান্ডার্ড জ্যাঙ্গো ম্যানেজার হিসাবে ঠিক কাজ করে। আপনি Model.objects কল করবেন না এবং এটির উপরে পুনরাবৃত্তি করুন। আপনি Model.objects.all () কে কল করুন এবং তারপরে আপনি পুনরাবৃত্তি করুন। জ্যাঙ্গো পরিচালক = / = জ্যাঙ্গো ক্যোয়ারসেট।
স্যাটরনিক্স

এবং যদি আপনি এটি লুপের জন্য কোনও টেম্পলেটে ব্যবহার করে থাকেন তবে আপনি objects% অবজেক্টে বস্তুর জন্য করতে পারেন otherঅর_বজেক্ট_সেট all সমস্ত%}
ব্রুস

@ স্টলেটারিয়েজেল ... বিশেষত যেহেতু একে "ব্লক_এসইটি" বলা হয় - এবং "ব্লক_সিল্লেডম্যানজার" নয়। বা "ব্লক_সেট_ সম্পর্কিত সম্পর্কক"।
ক্লাউজ

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.