Запутался при доставке PrimaryKeyRelatedField Клиенту

#django #django-rest-framework #django-serializer

Вопрос:

Если вы извлекете значение поля, используемого в качестве поля PrimaryKeyRelatedField, вы увидите значение в виде объекта, а не PK.

В случае официального документа я использую его, как показано ниже, но это сбивает с толку при использовании его с клиентом.

Я не знаю, будут ли дорожки содержать идентификатор или объект, просто взглянув на имя поля.

 class AlbumSerializer(serializers.ModelSerializer):
    tracks = serializers.PrimaryKeyRelatedField(many=True, read_only=True)

    class Meta:
        model = Album
        fields = ['tracks']
    
        def create(self, validated_data):
                tracks = validated_data.pop('tracks')  # [Track, Track ...]
 

Есть ли лучший способ?

Ответ №1:

tracks in tracks = validated_data.pop('tracks') будет содержать Track объекты, потому что вы получаете его из validated_data того, что использует to_internal_value , что, в свою очередь, дает вам объекты экземпляра модели.

Вы можете ознакомиться PrimaryKeyRelatedField с его реализацией здесь:

https://github.com/encode/django-rest-framework/blob/master/rest_framework/relations.py#L243

Реализация to_representation и to_internal_value должна дать вам подсказки. Вы можете прочитать больше здесь:

https://www.django-rest-framework.org/api-guide/serializers/#overriding-serialization-and-deserialization-behavior