Django REST Framework: слаг или сериализатор - PullRequest
0 голосов
/ 20 декабря 2018

Я использую Django Rest Framework для проекта, и у меня есть вложенный сериализатор, подобный этому:

class TopSerializer(serializers.ModelSerializer):
    contact = (something goes here)
    email = (something goes here)

Для POST, PATCH, PUT, DELETE я хочу указать эти значения с помощью slug.Предположим, что в каждом классе (контакт, электронная почта) есть член с именем resource_id, и это мой слаг.Для этих методов я мог бы использовать:

class TopSerializer(serializers.ModelSerializer):
    contact = serializers.SlugRelatedField(read_only=False, slug_field='resource_id')
    email = serializers.SlugRelatedField(read_only=False, slug_field='resource_id')

Тем не менее, для GET я хочу вернуть также встроенные объекты, поэтому я мог бы использовать:

class TopSerializer(serializers.ModelSerializer):
    contact = ContactSerializer(read_only=True)
    email = EmailSerializers(read_only=True)

Так как мне указать в моемСериализатор, что contact может быть либо слагом, либо сериализованным объектом?Есть ли способ сделать это только с одним сериализатором, или я должен иметь два разных сериализатора и использовать request.method в представлении, чтобы выбрать, какой сериализатор я использую?

Или я должен использовать что-то вроде этого:

class TopSerializer(serializers.ModelSerializer):
    contact = ContactSerializer(read_only=True)
    email = EmailSerializers(read_only=True)
    contact_rid = serializers.SlugRelatedField(read_only=False,slug_field=resource_id,queryset=models.Contact.objects.all())
    email_rid = serializers.SlugRelatedField(read_only=False,slug_field=resource_id,queryset=models.Email.objects.all())

Таким образом, я могу использовать contact_rid и email_rid для POST / PATCH / PUT / DELETE и вернуть поля контактов и электронной почты обратно в GET.

Я на правильном пути?Другие предложения?

Ответы [ 2 ]

0 голосов
/ 25 декабря 2018

Вы на правильном пути!

Используйте одно связанное поле для записи, а другое - для чтения всего объекта. Это хороший подход, если вам нужно больше подробностей для связанных объектов.

Вы также можете добавить в поле слагов флаг write_only=True если вы хотите, чтобы поле использовалось только для записи.Однако проверка этой опции не будет подсказывать выбранным объектам, когда вы находитесь под маршрутом обновления в Browseable API

Проверьте this anwser

0 голосов
/ 23 декабря 2018

Проверьте пользовательские поля https://www.django -rest-framework.org / api-guide / fields / # custom-fields Вы можете определить пользовательские поля сериализатора, которые переопределяют serializers.Field и переопределяют to_representationвернуть полностью сериализованный объект и to_internal_value, чтобы имитировать поведение slugRelatedField.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...