Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.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
Django 在最后一个孩子出生之前,什么样的关系才是最令人沮丧的?_Django_Django Models_Django Related Manager - Fatal编程技术网

Django 在最后一个孩子出生之前,什么样的关系才是最令人沮丧的?

Django 在最后一个孩子出生之前,什么样的关系才是最令人沮丧的?,django,django-models,django-related-manager,Django,Django Models,Django Related Manager,我正在努力寻找一种有效的方式来处理Django m2m关系 我的用例是: 我从表单接收一个字符串,并用这个字符串更新元素的状态 如果这个元素有子元素,我会用相同的值更新它们的状态 如果那些children元素有自己的子元素,那么我会更新状态并遍历它们的子元素等 我的模型m2m字段类似于:parent=models.ManyToManyField('self',blank=True,default=None,symmetric=False,verbose_name=“”) 目前我写了这样的东西

我正在努力寻找一种有效的方式来处理Django m2m关系

我的用例是:

  • 我从表单接收一个字符串,并用这个字符串更新元素的状态
  • 如果这个元素有子元素,我会用相同的值更新它们的状态
  • 如果那些children元素有自己的子元素,那么我会更新状态并遍历它们的子元素等
我的模型m2m字段类似于:
parent=models.ManyToManyField('self',blank=True,default=None,symmetric=False,verbose_name=“”)

目前我写了这样的东西:

if model == Ensemble:
    children = elem.ensemble_set.all()
    for child in children:
        update_elem_statut(child, statut)
        for en in child.ensemble_set.all():
            update_elem_statut(en, statut)
            if len(en.ensemble_set.all()):
                for en_child in en.ensemble_set.all():
                    update_elem_statut(en_child, statut)
但这绝对不是递归的。我需要遍历每个子元素,直到只有子元素。我不知道用什么样的方式来做这件事才是最像pythonish/djangoish的方式


提前感谢您的帮助。

简单的方法是向模型中添加一个方法,在所有当前对象子对象上调用相同的方法

class Ensemble(models.Model):

    def update_status(self, status):
        self.status = status
        self.save()
        for child in self.ensemble_set.all():
            child.update_status(status)

实现这一点的简单方法是向模型中添加一个方法,该方法在所有当前对象子对象上调用相同的方法

class Ensemble(models.Model):

    def update_status(self, status):
        self.status = status
        self.save()
        for child in self.ensemble_set.all():
            child.update_status(status)

为什么不呢?但是我该如何递归地调用它呢?调用child.update\u status(status)实际上使它递归。首先,谢谢,这是有效的。但是我不明白它为什么工作,我理解为什么在一个实例的children元素上调用这个方法,但是我不理解为什么在每个children元素上调用它。我真的需要澄清一下。这是正常的递归/python/django行为吗?不确定您不理解什么。此方法调用所有当前对象子对象的
update\u status
方法-调用所有if子对象的
update\u status
方法-调用所有if子对象的
update\u status
方法,依此类推,这是由于函数定义中的self参数吗?无论如何,谢谢你的回答和解释。为什么不呢?但是我该如何递归地调用它呢?调用
child.update\u status(status)
实际上使它递归。首先,谢谢,这很有效。但是我不明白它为什么工作,我理解为什么在一个实例的children元素上调用这个方法,但是我不理解为什么在每个children元素上调用它。我真的需要澄清一下。这是正常的递归/python/django行为吗?不确定您不理解什么。此方法调用所有当前对象子对象的
update\u status
方法-调用所有if子对象的
update\u status
方法-调用所有if子对象的
update\u status
方法,依此类推,这是由于函数定义中的self参数吗?无论如何,谢谢你的回答和解释。