【问题标题】:How to add current user into a field in django model serializer如何将当前用户添加到 django 模型序列化器中的字段中
【发布时间】:2017-05-08 18:45:07
【问题描述】:

我正在 django-rest-framework 中开发一个应用程序。以下是我的序列化器:

class MySerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = My
        fields = ('user','title','description')

问题是当我运行它时,它要求像这样选择用户:

我希望无论哪个用户登录,他都应该自动添加到用户字段中。在django网站开发中,我曾经使用request.user来做,但是在django rest框架中怎么做呢?

【问题讨论】:

标签: python django django-rest-framework


【解决方案1】:

可用于表示当前用户的默认类。为了使用它,“请求”必须在实例化序列化程序时作为上下文字典的一部分提供。

owner = serializers.HiddenField(
    default=serializers.CurrentUserDefault()
)

更多细节在这里: http://www.django-rest-framework.org/api-guide/validators/#currentuserdefault

希望这会有所帮助

【讨论】:

    【解决方案2】:

    你会做一些类似课堂的事情

    MySerializer(serializers.HyperlinkedModelSerializer):
        user = serializers.ReadOnlyField()
        class Meta:
            model = My
            fields = ('user','title','description')
    

    当您调用序列化程序时,您只需将当前用户添加到序列化程序中,无论是在views.py 中还是在序列化程序创建方法中。

    1. 在views.py中

      serializer.save(user=request.user)

    2. 在序列化程序中创建方法

      def create(self, validated_data): validated_data['user'] = request.user.id obj = ExampleModel.objects.create(**validated_data) return obj

    【讨论】:

    • 我必须把 def create(self,validated_data): 放在哪里?
    • 按语法,您的解决方案似乎是正确的,但我收到以下错误: is not JSON serializable
    • 哦,那你可能想把`user = serializers.ReadOnlyField()`改成`user = serializers.ReadOnlyField(source='user.id')`
    • 谢谢@shady,但问题仍然存在,如何将 request.user 添加到用户字段。因为 source='user.id' 添加了 null 所以我得到错误
    • 我上面已经告诉过你,当你在views.py中调用序列化类的save方法时,你使用ExampleSerializer.save而不是ExampleSerializer.save(user=request.user)。
    【解决方案3】:

    如果你扩展 django 视图泛型类,那么你可以在 views.py 中添加

    from rest_framework.permissions import IsAuthenticate
    
    class MyView(generics.ListCreateAPIView):
        permission_classes = (IsAuthenticated,)
        def perform_create(self, serializer):
            serializer.save(user=self.request.user)
    

    然后在 serializers.py 中

    class MySerializer(serializers.HyperlinkedModelSerializer):
        class Meta:
            model = My
            fields = ('user','title','description')
            read_only_fields = ('user',) # Add this
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-28
      • 1970-01-01
      • 1970-01-01
      • 2013-08-28
      • 1970-01-01
      • 2015-12-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多