DRF создает доступное для записи не модельное поле - PullRequest
0 голосов
/ 07 февраля 2019

Есть ли способ создать сериализатор, а не поле для записи модели, из полей модели два?Вот мой сериализатор

class UserProfileSerializer(serializers.ModelSerializer):
    full_name = ?
    class Meta:
        model = users.models.User
        fields = (
            'phone_number',
            'email',
            'city',
            'full_name'
        )

Я хочу соединить имя_имя и фамилию в полное_имя

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

Вы можете использовать serializers.CharField() с атрибутом write_only;

class UserProfileSerializer(serializers.ModelSerializer):
    full_name = serializers.CharField(max_length=225, write_only=True,
                                      required=False, allow_null=True)
    class Meta:
        model = users.models.User
        fields = (
            'phone_number',
            'email',
            'city',
            'full_name'
        )

, тогда вы сможете отправлять данные json как;

{
    "phone_number": "123456789",
    "email": "foo@bar.com",
    "city": "Foo",
    "full_name": "My Full Name"
}

и получать это значение послеserializer.is_valid() метод;

full_name = serializer.validated_data.get('full_name', '')
# full_name --> My Full Name
0 голосов
/ 07 февраля 2019

Вы можете использовать SerializerMethodField для создания полного_имя из first_name + last_name :

from rest_framework import serializers

class UserProfileSerializer(serializers.ModelSerializer):
    full_name = serializers.SerializerMethodField()
    class Meta:
        model = users.models.User
        fields = (
            'phone_number',
            'email',
            'city',
            'full_name'
        )

    def get_full_name(self, instance):
        return "{} {}".format(instance.first_name, instance.last_name)
...