django post_save信号和ManyToManyField(以及Django Admin)

时间:2016-01-27 20:26:30

标签: django django-signals

我遇到了post_save函数的问题。该函数已正确触发,但实例不包含不相关的值。我使用ipdb检查了函数,没有任何错误。只需ManyToManyField为空。

代码:

@receiver(post_save, sender=Supplier)
def set_generic_locations(sender, instance, **kwargs):
    """ Set the generic locations for the NEW created supplier.
    """
    created = kwargs.get('created')
    if created:
        glocations = LocationAddress.get_generic_locations()

        for location in glocations:
            instance.locations.add(location)

        instance.save()

实例中使用的字段:

locations = models.ManyToManyField(LocationAddress, blank=True)​

我不明白为什么,但地点总是空的。

我使用django 1.8.8

更新

问题是django管理员。我在这里找到了一个解释:http://timonweb.com/posts/many-to-many-field-save-method-and-the-django-admin/

解决django admin

中问题的代码
def save_related(self, request, form, formsets, change):
    super(SupplierAdmin, self).save_related(request, form, formsets, change)
    form.instance.set_generic_locations()

2 个答案:

答案 0 :(得分:2)

由于数据库结构的不同,ManyToManyFields对信号的工作方式略有不同。您需要使用m2m_changed信号

,而不是使用post_save信号

答案 1 :(得分:0)

对于manytomanyfield,您必须先保存父对象(),然后添加