这是我想要做的事情:
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)
答案 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}}。
建设性批评欢迎!
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()
class ItemViewSet(viewsets.ModelViewSet):
...
def perform_destroy(self, instance):
instance.delete_item_or_user_item(self.request.user)