我有这四个模型都与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 的值(与从中获取所有值的方式相同)。我怎么能这样做?
答案 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)