通过RESTAPI在Django中删除m2m关系而不是对象本身
我有三种型号:通过RESTAPI在Django中删除m2m关系而不是对象本身,django,django-models,many-to-many,django-rest-framework,django-signals,Django,Django Models,Many To Many,Django Rest Framework,Django Signals,我有三种型号:User、UserItem(m2m thourgh)和Item 用户可以创建项。这会自动创建一个UserItem 不同的用户可以看到该项目,并将其添加到自己的项目列表中,创建另一个UserItem 如果第一个用户想要删除项,另一个用户将不会高兴-它需要留下,但对于第一个用户,它似乎已经消失了。但是,如果只有一个用户仍与之相关,则可以安全地删除项,并应将其删除,以避免用死记录填充数据库 我认为应该这样处理: 项目删除从用户调用API Itempre\u delete检查Item.us
User
、UserItem
(m2m thourgh)和Item
用户
可以创建项
。这会自动创建一个UserItem
不同的用户
可以看到该项目
,并将其添加到自己的项目列表中,创建另一个UserItem
如果第一个用户
想要删除项
,另一个用户
将不会高兴-它需要留下,但对于第一个用户
,它似乎已经消失了。但是,如果只有一个用户
仍与之相关,则可以安全地删除项
,并应将其删除,以避免用死记录填充数据库
我认为应该这样处理:
项目删除
从用户调用API
Item
pre\u delete
检查Item.user\u set>1
True
,手动删除UserItem
,将项保留在原来的位置。如果False
,则删除项
UserItem
就不会通过API公开,并且简化了客户端的管理
这是正确的/常用的方法吗?用Django怎么做?我不确定如何在不引发异常的情况下防止
Item.delete()
在pre\u delete
中发生,但由于这是预期的行为,引发异常似乎不是正确的方法。我觉得这很好。但是,您可以覆盖项目模型上的delete()
方法,而不是使用信号。有关save()
方法的示例,请参见。您的delete()
方法也可以实现,即当还有其他用户使用UserItem时,它不会调用super()
。这对我来说似乎很好。但是,您可以覆盖项目模型上的delete()
方法,而不是使用信号。有关save()
方法的示例,请参见。您的delete()
方法也可以实现,即当还有其他用户使用UserItem时,它不会调用super()
。From:“如果您想要自定义删除行为,可以覆盖delete()方法。”
我想这就是你想要的:
def delete(self, *args, **kwargs):
if item.user_set > 1:
return
else:
super(Item, self).delete(*args, **kwargs) # Call the "real" delete() method.
From:“如果希望自定义删除行为,可以重写delete()方法。”
我想这就是你想要的:
def delete(self, *args, **kwargs):
if item.user_set > 1:
return
else:
super(Item, self).delete(*args, **kwargs) # Call the "real" delete() method.
这是我要的。它将逻辑保留在
模型中
,但视图
为它提供了当前的用户
我认为最好不要使用delete()
,因为管理员用户应该能够删除项目,而不管相关用户如何,并且在delete()
中没有访问当前用户的简单方法
欢迎建设性的批评
models.py
views.py
这是我要的。它将逻辑保留在模型中
,但视图
为它提供了当前的用户
我认为最好不要使用delete()
,因为管理员用户应该能够删除项目,而不管相关用户如何,并且在delete()
中没有访问当前用户的简单方法
欢迎建设性的批评
models.py
views.py
我仍然需要删除UserItem
(而不是return)。我不知道怎么做-我知道项目ID,但我需要获取用户ID,否则我无法删除正确的UserItem我仍然需要删除UserItem
(而不是返回)。我不知道怎么做-我知道项目ID,但我需要获得用户ID,否则我无法删除正确的UserItem
class ItemViewSet(viewsets.ModelViewSet):
...
def perform_destroy(self, instance):
instance.delete_item_or_user_item(self.request.user)