在模型更新

时间:2017-12-11 08:11:21

标签: django django-models

我有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)  

我需要什么:

  1. 当公司is_active变为False时,我想要所有与公司相关的产品,is_active变为false
  2. 当帐户is_active变为False时,我想要所有与帐户相关的公司,is_active变为false,并传播到产品
  3. 我知道我需要更改保存(或使用保存后信号),但我不知道如何选择和更改外键模型,并在帐户<的情况下向下传播多个级别/ p>

    从父母到孩子的关系是相反的,而不是从孩子到父母。,所以没有字段FK可用。

1 个答案:

答案 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所说)