我可以在Django中使用模型删除方法(删除相应的m2m)获取当前用户吗?

时间:2016-08-05 16:07:14

标签: django django-models m2m

这是我想要做的事情:

class Item(TimestampedModel):
    ....
    def delete(self, *args, **kwargs):

        # Other users have linked to this item, delete the link
        if UserItem.objects.filter(item=self).count() > 1:
            # TODO Delete the UserItem linking the current User to this Item

        # No one else has linked to this item, delete the item
        else:
            super(Item, self).delete(*args, **kwargs)

class UserItem(TimeStampedModel):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    item= models.ForeignKey(Item, on_delete=models.CASCADE)

3 个答案:

答案 0 :(得分:1)

如果您只想确保在删除之前超过1个用户未使用Item,那么您可以执行以下操作:

添加related_name以方便使用:

class UserItem(TimeStampedModel):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    item= models.ForeignKey(Item, on_delete=models.CASCADE, ralated_name='used_by')

在删除之前,你可以这样检查:

if self.used_by.values('user').distinct().count() > 1:
   # THIS MEANS THERE ARE MORE THAN ONE USER LINKING TO THIS ITEM
else:
   super(Item, self).delete(*args, **kwargs)

虽然如果你选择实现这个,那么我只假设用户是#34;链接"到这个项目可以删除它,以便没有人可以删除另一个项目。

通常情况下,在视图中执行此类逻辑会更好(如@wobbily_col所评论)。

答案 1 :(得分:1)

set the clipboard to myList as string 的后置条件应该是模型实例不再存在于数据库中。

条件删除是一种位于视图和模型之间的业务逻辑。通过这种观察,您可以自己定义函数的名称和参数。说delete

另请参阅“Fat Models,Utility Modules,Thin Views,Stupid Templates”下的“两个Django”。

答案 2 :(得分:0)

这就是我的用途。它将逻辑保留在model中,但view为其提供当前user

我认为最好不要使用delete()因为管理员用户应该能够删除项目而不管相关用户,并且没有简单的方法来访问user内的delete() 1}}。

建设性批评欢迎!

models.py

class Item(TimeStampedModel):

    ...

    def delete_item_or_user_item(self, user):
        """
        Delete the Item if the current User is the only User related to it.
        If multiple Users are related to the Item, delete the UserItem.
        """
        if UserItem.objects.filter(item=self).count() > 1:
            UserItem.objects.filter(item=self, user=user).delete()
        else:
            self.delete()

views.py

class ItemViewSet(viewsets.ModelViewSet):

    ...

    def perform_destroy(self, instance):
        instance.delete_item_or_user_item(self.request.user)