【发布时间】:2015-03-29 17:31:30
【问题描述】:
我正在研究很多示例,但我找不到 100% 有效的方法。
class QuestionViewSet(viewsets.ModelViewSet):
queryset = QNAQuestion.objects.all()
serializer_class = QuestionSerializer
permission_classes = (IsOwnerOrReadOnly, )
filter_fields = ('id', 'user')
filter_backends = (filters.DjangoFilterBackend, filters.OrderingFilter)
def perform_create(self, serializer):
serializer.save(user=self.request.user)
到目前为止,这工作正常,但它仍然需要用户输入提供 user_id,即使它被 request.user 忽略和替换。
class QuestionSerializer(serializers.ModelSerializer):
class Meta:
user = serializers.ReadOnlyField()
model = QNAQuestion
fields = ('id','user','subject', 'body', 'solution')
所以我想我必须修改我的序列化程序。我尝试了 HiddenInput 和 ReadOnly,但两者都没有真正做到这一点。如果我将其隐藏,则不再需要 user_id,但在查看现有对象时它也会被隐藏。如果我将其设为只读,则不需要,但保存序列化程序不再起作用。我收到 django 对象不可序列化为 JSON 的错误消息。
class IsOwnerOrReadOnly(permissions.BasePermission):
"""
Object-level permission to only allow owners of an object to edit it.
Assumes the model instance has an `user` attribute.
"""
def has_object_permission(self, request, view, obj):
# Read permissions are allowed to any request,
# so we'll always allow GET, HEAD or OPTIONS requests.
if not request.user.is_authenticated():
return False
if request.method in permissions.SAFE_METHODS:
return True
# Instance must have an attribute named `owner`.
return obj.user == request.user
那我该如何解决呢? user_id 应该是可见的,但我希望它是 request.user 并且我不希望在创建新对象时需要它。理想情况下,使用自动生成的 api gui 时也应该隐藏它。
感谢您的宝贵时间。抱歉拼写或语法错误,我不是母语人士。
【问题讨论】:
-
你能发布 QNAQuestion 的 models.py 吗?
标签: django django-rest-framework django-1.7