Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过RESTAPI在Django中删除m2m关系而不是对象本身_Django_Django Models_Many To Many_Django Rest Framework_Django Signals - Fatal编程技术网

通过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)