【问题标题】:How to deal with user_id field properly?如何正确处理 user_id 字段?
【发布时间】: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


【解决方案1】:

尽量使字段仅required=False 而不是HiddenReadOnly

class QuestionSerializer(serializers.ModelSerializer):
    class Meta:
        model = QNAQuestion
        fields = ('id','user','subject', 'body', 'solution')
        extra_kwargs = {
            'user': {'required': False}
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多