2011-06-11 28 views
40

DjangoTypeError:

iterable değildir 'RelatedManager' nesne sonraki modelleri 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 

demek, b1g1 grup vardır bloke ederler. Adına göre tüm bloklarını g1 gruptan almak istiyorum. Bana iterable değildir RelatedManager nesneyi döndürür

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 

ama b1.group.block_set: Ben önümüzdeki özyinelemeli fonksiyon yazdım.

Ne yapmalı? Sorun nedir?

cevap

98

bu deneyin:

block in group.block_set.all() 
+4

RelatedManager'ın neden yinelenebilir hale gelmediğini bilen var mı? Bu şekilde olmasını beklerdim ... – stalepretzel

+0

Bu yorum biraz geç oldu, ancak mantıksal olarak, db'ye getirmeden önce sorguyu kısıtlamak için yönetici üzerinde filtreleme yöntemlerini kullanabilmeniz. – ovangle

+5

@stalepretzel, çünkü tam olarak standart bir django yöneticisi olarak çalışıyor. Model.objects'i çağırmaz ve tekrarlar. Model.objects.all() öğesini çağırın ve sonra yineleyin. Django yöneticisi =/= Django queryset. – Saturnix

18

bunu like a Manager kullanın. Tüm nesneleri istiyorsanız, all() yöntemini arayın.