gpt4 book ai didi

django-rest-framework - Django REST 框架限制发布和可浏览的 API 字段

转载 作者:行者123 更新时间:2023-12-03 18:22:21 25 4
gpt4 key购买 nike

我使用 Django Rest framework连同一个 JavaScript 应用程序。我在使用通用 ModelViewSet 正确发布新数据项时遇到了一些困难。

最重要的是我想限制海报可以提交的内容
(他们应该只被允许发布具有该用户( session 的经过身份验证的用户)的 user_id 的项目。

我不知道我应该何时/在哪里检查这个?这是一个验证问题吗?
我对权限类的理解是它们限制了方法(发布/获取)或检查用户组。

还有我在 item model 中的用户字段是 user model 的外键
因此可浏览的 api 在 Html 表单中建议一个包含其他用户信息的下拉列表。 (他们的电子邮件地址和其他一些字段)。

我的数据项看起来像这样

[{
"id": 792,
"name": "test",
"category": 1,
"value": 5,
"user": "33"
}]

这是我的序列化器和 View 集:
class ItemSerializer(serializers.ModelSerializer):

class Meta:
model = Item
fields = ('id',
'name',
'category',
'value',
'user',
)

class ItemViewSet(viewsets.ModelViewSet):
serializer_class = ItemSerializer

def get_queryset(self):
return Item.objects.filter(user=self.request.user)

最佳答案

处理用户字段

首先将用户字段设置为只读:

# serializers.py     

class ItemSerializer(serializers.ModelSerializer):
user = serializers.ReadOnlyField()
class Meta:
model = Item
fields = ('id',
'name',
'category',
'value',
'user',
)

然后在创建时自动设置用户 ID:
# views.py

class ItemViewSet(viewsets.ModelViewSet):
serializer_class = ItemSerializer

def get_queryset(self):
return Item.objects.filter(user=self.request.user)

def perform_create(self, serializer):
serializer.save(user=self.request.user.customer)

处理权限

只需使用 standard permissions mechanism定义一个自定义:
# permissions.py

from rest_framework import permissions

class IsOwner(permissions.BasePermission):
def has_object_permission(self, request, view, obj):
return (request.user.is_authenticated() and
(obj.user == request.user.customer))

...并在您的 View 集中使用它:
# views.py

from permissions import IsOwner

class ItemViewSet(viewsets.ModelViewSet):
permission_classes = [IsOwner]
...

关于django-rest-framework - Django REST 框架限制发布和可浏览的 API 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25899534/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com