如何删除对象以响应Django中的m2m_changed信号?

时间:2014-07-09 19:33:42

标签: django

我有两个模型ImageCategory通过m2m关系(在类别中定义)相关。图像可能属于几个类别。 API允许从类别中删除图像。作为回应,我需要在没有类别时删除图像。

我有以下内容:

@receiver(m2m_changed, sender=Category.images.through)
def delete_image_if_has_no_categories(sender, instance, action, reverse,
                                      model, pk_set, **kwargs):
    # we only watch reverse signal, because in other cases the images are
    # being moved or copied, so don't have to be deleted.
    if reverse and action == 'post_remove':
        if not instance.categories.exists():
            instance.delete()

我已经放置了几个调试日志来检查代码是否正在运行。它运行。但是instance.delete()之后图像仍保留在数据库中。

我在remove_from_category内有transaction.atomic视图,但它没有帮助。

有什么想法吗?

更新

视图在我们的Image模型中调用此方法:

def remove_from_category(self, category_id):
    self.categories.remove(category_id)

视图通过REST API调用,如DELETE /category/<catid>/<image-id>

images模型中的Category字段定义如下:

class Category(MPTTModel):
    images = models.ManyToManyField(
        'Image',
        related_name='categories',
        null=True, blank=True,
    )

MPTTModel会成为罪魁祸首吗?我使用django-mptt==0.6.0

1 个答案:

答案 0 :(得分:0)

我猜你可以调用ur方法删除你想要删除的所选项目在pre_clear方法上显示(django总是保存pre_clear中ur m2m字段的最后一个更改,所以如果属性在那里但没有在你post_add上这个obj正在被删除,所以你可以在那里强制触发ur函数

检查我的答案 https://stackoverflow.com/a/39331735/6373505