Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 类型错误:';相关经理';对象是不可编辑的_Python_Django_Django Models_Django Queryset - Fatal编程技术网

Python 类型错误:';相关经理';对象是不可编辑的

Python 类型错误:';相关经理';对象是不可编辑的,python,django,django-models,django-queryset,Python,Django,Django Models,Django Queryset,德扬戈 我有以下型号: 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.Char

德扬戈

我有以下型号:

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
比如说,blockb1g1组。根据它的名称,我想从组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返回我RelatedManager对象,这是不可编辑的

怎么办?怎么了?

试试这个:

block in group.block_set.all()
使用它。如果需要所有对象,则调用
all()
方法。

必须使用.all()和相关名称或父模型

在views.py中使用:

for item in object.relatedname.all():
    do something ......
在html模板中使用:

 {% for item in object.relatedname.all %}
   do something ......
 {% endfor %}

有人知道为什么RelatedManager不能胜任吗?我本以为会是这样的……这个评论有点晚了,但原因是您可以在管理器上使用过滤方法,以便在对db执行提取之前限制查询。@stalepretzel,因为它完全像标准的django管理器一样工作。您不需要调用Model.objects并对其进行迭代。调用Model.objects.all()然后进行迭代。Django manager=/=Django queryset。如果您在循环的模板中使用它,您可以在objects.other_object_set.all%}@stalepretzel中为objects.other_object_set.all%}执行{%操作,特别是因为它被称为“blocks_set”,而不是“blocks_relatedmanager”。或“块集相关管理器”。