我有3个型号,帐户,公司和产品。产品有一个ForeignKey to Company,company和FK to account。 所有这些都有一个名为' is_active'。
的字段class Product(Meta):
company = models.ForeignKey(Company, related_name='products', on_delete=models.CASCADE)
is_active = models.BooleanField(default=False)
class Company(Meta):
account = models.ForeignKey(Account, related_name='account', on_delete=models.CASCADE)
is_active = models.BooleanField(default=False)
我需要什么:
我知道我需要更改保存(或使用保存后信号),但我不知道如何选择和更改外键模型,并在帐户<的情况下向下传播多个级别/ p>
从父母到孩子的关系是相反的,而不是从孩子到父母。,所以没有字段FK可用。
答案 0 :(得分:1)
让我告诉你我的解决方案。首先,您应该跟踪对该字段的更改(在本例中为&#34; is_active&#34;)。要在模型的 init 中执行此操作,必须保留缓存值,并且在保存时应检查值:如果已更改,则更新db:
class Company(Meta):
...(field definitions)
def __init__(self, *a, **kw):
super().__init__(*a, **kw):
self.__original_is_active = self.is_active
def save(self, *a, **kw):
if self.__original_is_active != self.is_active and self.is_active==False:
# use raw update to perform better than loop
self.products.update(is_active=False)
super().save(*a, **kw)
更新(添加帐户更改代码) 我想公司模型与Account
有ForeignKey关系class Account(Meta):
...(field definitions)
def __init__(self, *a, **kw):
super().__init__(self, *a, **kw)
self.__original_is_active = self.is_active
def save(self, *a, **kw):
if self.__original_is_active != self.is_active and self.is_active == False:
for company in self.company_set.all():
company.is_active = False
company.save()
super().save(*a, **kw)
如果您拥有从帐户到公司的ManyToMany关系,那么在save方法中将self.company_set.all()更改为self.companies.all()以及所有。
您的帐户模式将采取类似的更改,但不要忘记使用for循环更新公司,因为&#34;更新&#34;方法不会生效,因为它将直接执行SQL并忽略&#34; init ,保存&#34;我在公司做过的事情(如docs所说)