D. Make
D. Make

Reputation: 600

AttributeError with non-model Field serialization

I have a model:

class Company(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, null=True)
    name = models.CharField(max_length=30, blank=True)
    balance = models.DecimalField(max_digits=10, decimal_places=2, default=0)
    phone_number = PhoneNumberField(null=True, blank=True)
    active = models.BooleanField(default=False)

And I need to serialize creation of User and Model. Idea is to ask User company name while doing registration, so I have:

class CreateUserSerializer(serializers.ModelSerializer):
    company_name = serializers.CharField(required=True)

    class Meta:
        model = User
        fields = ('id', 'company_name', 'username', 'email', 'password')
        extra_kwargs = {'password': {'write_only': True}}

    def create(self, validated_data):
        username = validated_data['username']
        email = validated_data['email']
        password = validated_data['password']
        company_name = validated_data['company_name']
        user = User.objects.create(username=username, email=email, password=password)
        Company.objects.create(user=user, name=company_name)
        return user

And I get error:

Got AttributeError when attempting to get a value for field company_name on serializer CreateUserSerializer. The serializer field might be named incorrectly and not match any attribute or key on the User instance. Original exception text was: 'User' object has no attribute 'company_name'.

Anyway objects Company and User are created as I can see it in my admin panel. What am I doing wrong and how can I fix it?

Upvotes: 1

Views: 153

Answers (1)

neverwalkaloner
neverwalkaloner

Reputation: 47354

You can use source field's argument in this case:

class CreateUserSerializer(serializers.ModelSerializer):
    company_name = serializers.CharField(required=True, source='company.name')

Upvotes: 1

Related Questions