TypeError: 'RelatedManager' nesnesi yinelenemez


87

Django

Sonraki modellerim var:

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

mesela, blok b1 sahip G1 grubu. İsmine göre g1 grubundaki tüm blokları almak istiyorum . Bir sonraki özyinelemeli işlevi yazdım:

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

ancak b1.group.block_set bana yinelenemeyen RelatedManager nesnesini döndürüyor.

Ne yapalım? Sorun nedir?

Yanıtlar:


180

Bunu dene:

block in group.block_set.all()

9
RelatedManager'ın neden yinelenebilir hale getirilmediğini bilen var mı? Öyle olmasını
beklerdim

2
Bu yorum biraz geç kalmıştır, ancak bunun nedeni, veritabanına bir getirme gerçekleştirmeden önce sorguyu kısıtlamak için yöneticideki filtreleme yöntemlerini kullanabilmenizdir.
ovangle

8
@stalepretzel, çünkü tam olarak standart bir django yöneticisi olarak çalışıyor. Model.objects'i çağırıp üzerinde yineleme yapmazsınız. Model.objects.all () 'ı çağırırsınız ve sonra yinelersiniz. Django yöneticisi = / = Django sorgu kümesi.
Saturnix

ve bunu döngü için bir şablonda kullanıyorsanız, {% for object in objects.other_object_set.all%} yapabilirsiniz
Bruce

@stalepretzel ... özellikle "block_SET" olarak adlandırıldığından ve "block_relatedmanager" olmadığından. Veya "Blocks_set_relatedmanager".
Klaws

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.