python - Django REST Framework 中的自定义列表权限

标签 python django python-2.7 django-rest-framework

我正在尝试弄清楚如何处理自定义列表权限。

我最好用例子来解释,所以我编造了这个场景来解释我的问题。

假设我有一个 User型号,以及 User有一个 ForeignKeyBank , 一个 Bank可以打开(或不打开)。

我已经为 Bank 的读取请求设置了权限只有在 Bank 时才允许被打开, 此外,User对象可以由任何人创建( Bank ,比如说,只能由管理员用户创建)。所以我对 Bank 的权限是这样的:

def has_object_permission(self, request, view, obj):
    if request.method in permissions.SAFE_METHODS
        return obj.opened
    return True

如果我将 View 设置为 queryset = Bank.objects.all()

我去/banks ,我仍然可以看到关闭的银行(这不是我想要的)。如果我去 /banks/<pk> ,我将收到一条需要身份验证的消息(这很好)。

因此,如果我将 View 设置为 queryset = Bank.objects.filter(opened=True)

我去/banks , 瞧,只列出已开设的银行。

这是棘手的部分, 如果我继续创建一个用户,并且因为 BankForeignKey , 我仍然可以在 API 浏览器中看到所有可供选择的银行的列表,无论是否打开。

如何修复它以便只显示打开的银行?希望我的例子足够清楚。谢谢!

最佳答案

您可以为您的用户序列化程序覆盖 bank 字段:

class UserSerializer(serializers.ModelSerializer):
    bank = serializers.PrimaryKeyRelatedField(queryset=Bank.objects.filter(opened=True))

    class Meta:
        model = User

关于python - Django REST Framework 中的自定义列表权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20931227/

相关文章:

django - 如何使用 url 修复 django 'django.core.exceptions.ImproperlyConfigured' 的错误?

python - 如何设置 DestroyAPIView 方法不真正删除我的实例?

python - 相当于 python 2.7.5 中的 eval()

php - 什么是 strpos($elem ,"text") !== false) 的 python 等价物

python os.path.dirname 使用 Windows 网络路径产生错误的结果

python - 从大目录中随机延迟加载文件

python - 使用 BeautifulSoup 无法访问 div

python - 我的蛇在水平和垂直时向后退

python - 无法将用户字段内联到 UserProfile 管理选项卡 - 'auth.User' 没有外键到 'MyApp.UserProfile'

python - 无法在 Ubuntu Linux 16 上的 Python 2.7 中导入 pyttsx