Передайте переменную (non-model-field) в сериализатор в структуре отдыха django - PullRequest
0 голосов
/ 02 октября 2018

Я добавил поле, не являющееся моделью, в мой сериализатор, но после нажатия кнопки api оно возвращает поле как значение None, оно не сохраняет значение для использования в функции сериализатора

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"
}

мне нужно получить значение user_id (не пользователя, который выполнил запрос, а другого user_id)от json-запроса, как указано выше, 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

`

1 Ответ

0 голосов
/ 03 октября 2018

Используйте serializers.CharField() вместо serializers.SerializerMethodField() вместе с write_only=True пометить как

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


Примечание : Не забудьте удалить метод get_user_id() из текущего фрагмента кода

...