使用ManyToManyField在相关模型中设置值

时间:2016-07-06 08:16:37

标签: django django-models

我有这四个模型都与ManyToManyFields相关:

  

< - > B < - > C < - > D

给定一个A对象,我需要在D中的相关字段中设置一个值。

class A(models.Model):
    name = models.CharField()

    # Get all foo, from differents B, C and D
    @property
    def get_all_foo(self):
        for b in B.objects.filter(...):
            for c in C.objects.filter(...):
                foo = ';'.join([d.foo for d in D.objects.filter(...)])
        return foo

    def set_foo(self, value):
        # the code I need

class B(models.Model):
    a = ManyToManyField(A)

class C(models.Model):
    b = ManyToManyField(B)

class D(models.Model):
    c = ManyToManyField(C)
    foo = models.TextField()

我需要的是从A中的函数设置D中的 foo 的值(与从中获取所有值的方式相同)。我怎么能这样做?

1 个答案:

答案 0 :(得分:1)

首先,您的get_all_foo方法效率非常低,可能导致数千个单独的数据库调用。替换为:

return ';'.join(D.objects.filter(c__b__a__=self).values_list('foo'))

您可以使用相同的原则从A:

更新D对象
D.objects.filter(c__b__a__=self).update(foo=value)