【发布时间】:2021-04-09 12:04:32
【问题描述】:
我想限制我的 ViewSet 以便它允许基于权限的不同输入:
我的模型:
class Link(models.Model):
name = models.CharField("name", max_length = 128)
page = models.PositiveIntegerField("page", default = 1, choices = [(1, 1), (2, 2), (3, 3)])
layouts = models.ManyToManyField(Layout)
class Layout(models.Model):
name = models.CharField("name", max_length = 32)
序列化器:
class LinkSerializer(serializers.ModelSerializer):
test = serializers.SerializerMethodField("get_layouts")
def get_layouts(self): ## this is not displayed?
return "test"
class Meta:
model = Link
fields = ["name", "page", "test"]
例如,我有一个提供all_pages 权限的助手类。在restframework API中,我现在有一个来自第1-3页的下拉菜单,但是如果用户无权使用所有页面,我只想显示page 1以供选择(或使其成为没有输入字段的文本字段) .
同样的问题适用于 ManyToMany 字段:如何将布局下拉选项限制为我在管理平面中为该用户选择的选项?
现在我手动检查ViewSet 的PUT 方法中的所有内容并返回“不允许用户... -> 错误请求”。
编辑:BC 有人问我,现在我在做这样的事情:
class TestViewSet(viewsets.ViewSet):
serializer_class = LinkSerializer
http_method_names = ['get', 'put', 'head']
authentication_classes = [SessionAuthentication,]
permission_classes = [IsAuthenticated,]
def list(self, request):
...
def put(self, request):
## page logic
if "app.all_pages" in request.user.get_user_permissions():
try:
if not 1 < int(request.data["page"]) <= 3:
return Response(data = "page not 2 or 3",
status = status.HTTP_406_NOT_ACCEPTABLE)
except Exception as E:
return Response(data = f"""Error in page selection: {E}""",
status = status.HTTP_400_BAD_REQUEST)
page = int(request.data["page"])
else:
page = 2
## layout logic:
store = Store.objects.get(user = request.user)
allowed_layouts = [l.id for l in store.layouts.all()]
if not int(request.data["layout"]) in allowed_layouts:
return Response(data = f"""layout not allowed for store {store}""",
status = status.HTTP_406_NOT_ACCEPTABLE)
layout = Layout.objects.get(pk = request.data["layout"])
## do something with page 2 and layout ... in DB/another API
【问题讨论】:
-
发布与逻辑相关的视图集。也发布你的辅助方法
-
我通过我的解决方法更新了我的问题(这很好,但我确信这是一个非常次优的解决方案)。
标签: django django-rest-framework