Sipan
Sipan

Reputation: 221

DRF create writable not model field

Is there any way to create serializer not model writable field from model two fields? Here is my Serializer

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

I want to connect firts_name and last_name into full_name

Upvotes: 0

Views: 540

Answers (2)

uedemir
uedemir

Reputation: 1714

You can use serializers.CharField() with write_only attribute;

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'
        )

then you will be able to send json data like;

{
    "phone_number": "123456789",
    "email": "[email protected]",
    "city": "Foo",
    "full_name": "My Full Name"
}

and for getting that value after serializer.is_valid() method;

full_name = serializer.validated_data.get('full_name', '')
# full_name --> My Full Name

Upvotes: 2

HuLu ViCa
HuLu ViCa

Reputation: 5452

You can use a SerializerMethodField to construct the full_name from 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)

Upvotes: 1

Related Questions