【问题标题】:How to delete an object in response to a m2m_changed signal in Django?如何删除对象以响应 Django 中的 m2m_changed 信号?
【发布时间】:2014-07-09 19:33:42
【问题描述】:

我有两个模型 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() 之后,图像仍保留在数据库中。

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

有什么想法吗?

更新

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

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

视图是通过像 DELETE /category/<catid>/<image-id> 这样的 REST API 调用的。

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

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

MPTTModel 会是罪魁祸首吗?我正在使用django-mptt==0.6.0

【问题讨论】:

  • 我还需要查看相关的模型、视图和表单代码。有许多细节可能导致这种行为。
  • 验证您的实例是图像而不是 m2m 关系本身。
  • @Mr.Dave 我已经验证实例是图像;否则instance.categories 会引发 AttributeError,不是吗?
  • @RobertJørgensgaardEngdahl 我正在尝试收集相关部分。这是一个很大的应用程序。
  • 正如@RobertJørgensgaardEngdahl 所说,至少不看一些代码就很难知道。也许您也可以在类别中发布定义的 m2m 字段?这将有助于消除一些关于您如何定义 m2m 的假设。

标签: django


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2013-09-05
    • 2018-03-28
    • 2011-09-21
    • 2019-10-17
    • 2018-11-10
    • 2020-07-15
    • 2021-11-03
    • 1970-01-01
    • 2012-09-23
    相关资源
    最近更新 更多