【发布时间】:2014-07-09 19:33:42
【问题描述】:
我有两个模型 Image 和 Category 通过 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