Reputation: 253
I added a non model field to my serializer but after I hit api it returns the field as None value it doesn't store the value to use it in serializer function
serializers.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 request
{
"user_id":"22",
"name":"a"
}
what i need is retrieve user_id (not the user who did the request but it is other user_id) value from json request as above json code to serializer class to use it in if statement.
please any one has the solution help me I tried to over ride the context but it didnt work fine with me
thanks
Edit
`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
`
Upvotes: 2
Views: 6642
Reputation: 88559
Use serializers.CharField()
instead of serializers.SerializerMethodField()
along with write_only=True
flag as
class LeaveTeamSerializer(serializers.ModelSerializer):
user_id = serializers.CharField(write_only=True)
# .... your code
Note: Don't forgot to remove get_user_id()
method from your current code snippet
Upvotes: 2