【问题标题】:Pass variable (non-model-field) to serializer in django rest framework将变量(非模型字段)传递给 django rest 框架中的序列化程序
【发布时间】:2019-03-07 13:22:33
【问题描述】:

我在我的序列化程序中添加了一个非模型字段,但是在我点击 api 后,它将该字段作为 None 值返回,它不会存储要在序列化程序函数中使用它的值

序列化器.py

class LeaveTeamSerializer(serializers.ModelSerializer):
    user_id = serializers.SerializerMethodField()

    class Meta:
        model = Team
        fields = ['id', 'name', 'user_id', 'players']

    def get_user_id(self, *args, **kwargs):
        user_id = None  # kwargs['context']['request'].user_id
        return user_id # user_id it's not who did the request it is other user_id

    def update(self, instance, validated_data):
        user_id = validated_data.get('user_id')
        user = self.context['request'].user

        if user_id is None or user_id == '':
            instance.players.remove(user)
        else:
            instance.players.remove(user_id)
        instance.save()
        return instance

views.py

class LeaveTeamListAPIView(RetrieveUpdateAPIView):
    queryset = Team.objects.all()
    serializer_class = LeaveTeamSerializer

    def get_queryset(self):
        return Team.objects.filter(players=self.request.user) and Team.objects.filter(admin=self.request.user)

json put 请求

{
    "user_id":"22",
    "name":"a"
}

我需要的是从 json 请求中检索 user_id(不是发出请求的用户,而是其他 user_id)值,如上面的 json 代码到序列化程序类以在 if 语句中使用它。

请任何人有解决方案帮助我 我试图超越上下文,但它对我不起作用

谢谢

编辑

`class LeaveTeamSerializer(serializers.ModelSerializer):
    user_id = serializers.CharField(write_only=True)

    class Meta:
        model = Team
        fields = ['id', 'name', 'user_id', 'players']

    def update(self, instance, validated_data):
        user_id = self.user_id
        print(user_id)        
        user = self.context['request'].user

        if user_id is None or user_id == '':
            instance.players.remove(user)
        else:
            instance.players.remove(user_id)
        instance.save()
        return instance

`

【问题讨论】:

  • SerializerMethodField 用于只读字段。它不能用于访问您 POST/PUT 到视图的数据。但是您不需要添加字段。正如@Linovia 所提到的,您可以通过访问序列化程序中的上下文来访问请求中的任何内容——例如request.userrequest.POST['user_id'],就像你已经做的那样。
  • 我试过你的答案,但request.POST['user_id'] 给了我这个错误'dict' object has no attribute 'POST',顺便说一句,user_id 不是请求的用户,但请求的用户会添加其他 user_id,如果不清楚
  • 抱歉,request.data 呢?

标签: python django python-3.x django-rest-framework postman


【解决方案1】:

使用 serializers.CharField() 而不是 serializers.SerializerMethodField() 以及 write_only=True 标志

class LeaveTeamSerializer(serializers.ModelSerializer):
    user_id = serializers.CharField(write_only=True)
    # .... your code


注意:不要忘记从您当前的代码 sn-p 中删除 get_user_id() 方法

【讨论】:

  • 感谢您的回答,但我尝试了您所说的user_id = serializers.CharField(write_only=True)def update user_id = self.user_id print(user_id) 它引发了错误:'LeaveTeamSerializer' 对象没有属性'user_id'我删除了def get_user_id:
  • self.user_id 不在您的 OP 中。请添加更新的代码
  • @hishamDigital 使用validated_data.pop('user_id') 而不是self.user_id
  • 非常感谢@JPG,您的回答对我很有效,我在validated_data.pop('user_id') 之前添加了self 并且工作正常非常感谢
猜你喜欢
  • 2016-04-07
  • 2012-11-16
  • 2019-10-26
  • 1970-01-01
  • 2016-05-04
  • 2013-02-07
  • 1970-01-01
  • 2018-01-01
  • 2013-03-31
相关资源
最近更新 更多