鉴于以下模型,已经创建了四个实例(A,B,C,D),我想在将公司添加到实例D时触发挂钩。
class Foo(models.Model):
name = models.CharField()
description = models.TextField()
company = models.ManyToManyField(Company)
我考虑使用post_save信号,但我不确定它是否是一个好方法。
答案 0 :(得分:1)
对不起,我的不好。我误解了你的问题。如果您想要处理m2m
字段的保存,最佳做法是使用m2m_changed
信号。
通常,使用信号是一种很好的做法。这是他们创建的原因之一!
@receiver(m2m_changed, sender=Foo.company.through)
def handler(sender, instance, pk_set, action, **kwargs):
if instance.name == 'D' and action == 'post_add' and instance.company is not None:
...
答案 1 :(得分:0)
尝试使用内置预保存信号。这样您就可以获取D实例并检查“公司”字段是否即将更改。然后添加一个钩子。
@receiver(pre_save, sender=Foo)
def foo_pre_save(sender, instance, **kwargs):
try:
foo = Foo.objects.get(name=D_name)
if((foo.company == None) and (instance.company != None)):
# do your hook here
except Foo.DoesNotExist:
# handle exception