2016-07-06 5 views
0

У меня есть эти четыре модели все связаны ManyToManyFields:установленное значение в соответствующей модели с ManyToManyField

< -> 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() 

Мне нужно установить значение foo в D из функции в A (таким же образом я получаю все значения от нее). Как я могу это сделать?

ответ

1

Во-первых, ваш метод get_all_foo невероятно неэффективен, что потенциально вызывает тысячи отдельных запросов к базе данных. Замените его:

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

Вы можете использовать тот же принцип, чтобы обновить объекты D от A:

D.objects.filter(c__b__a__=self).update(foo=value) 
+0

Определенно более эффективным, но мне интересно, если он изменяет результаты оп получает от этого метода, поскольку обув перезаписывается на каждой итерации. Вероятно, это должно быть то, что вы показали здесь, хотя – Sayse