我正在为 Django Rest Framework 构建服务器。它为房屋、合同和业主建模。基本上,一个
House
可以有多个 Contract
,每个 Contract
都有一个 Owner
。
我正在为
DetailView
编写一个 House
的自定义权限,如果您拥有 House
(如果您拥有该 Contract
的 House
并且您是Owner
。
这是我到目前为止所拥有的:
class UserOwnsTheHouseSlugInUrlPermission(permissions.BasePermission):
"""
Permission to check if the user is an owner for the given House.
This permission needs a house_slug to be given in the url.
"""
message = _(USER_IS_NOT_OWNER_PERMISSION_DENIED_MESSAGE)
def has_object_permission(self, request, view, obj):
owner = get_object_or_None(UserOwnerProfile, user=request.user)
if owner and owner in obj.contracts.owner:
return True
return False
此代码不起作用。在 JavaScript 中你可以这样写:
if(obj.contracts.map(contract => contract.owner).includes(owner))
或者类似的东西。 Python 不是我的主要语言,所以我不知道如何在 Python 或 Django 中表达该条件。
我该如何写这个?
正如我在评论中提到的,问题不在于 Python 语法。问题是
obj.contracts
可能是一个外键,它返回一个查询集;查询集不会有 owner
属性,即查询集中每个模型实例上的一个字段。
现在您可以这样做来获取所有所有者的列表:
if owner and owner in obj.contracts.values_list('owner', flat=True)
但这将是错误的解决方案。你真正想做的是询问数据库所有者是否在合同所有者列表中:
if owner and obj.contracts.filter(owner=owner).exists()