【发布时间】: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.user或request.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