【问题标题】:Custom list permissions in Django REST FrameworkDjango REST Framework 中的自定义列表权限
【发布时间】:2014-01-22 18:01:06
【问题描述】:

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

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

假设我有一个User 模型,而User 有一个ForeignKey 到一个Bank,一个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

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

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

如果我将视图设置为queryset = Bank.objects.filter(opened=True)

我去/banks,瞧,只列出了开张的银行。

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回复,我一直在尝试您的解决方案,它适用于我上面描述的问题。
    最近更新 更多