首页 > 解决方案 > 具有非模型字段序列化的 AttributeError

问题描述

我有一个模型:

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)

我需要序列化用户和模型的创建。想法是在注册时询问用户公司名称,所以我有:

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

我得到错误:

company_name尝试获取序列化程序上的字段值时出现 AttributeError CreateUserSerializer。序列化器字段可能命名不正确,并且与User实例上的任何属性或键都不匹配。原始异常文本是:“用户”对象没有属性“公司名称”。

正如我在管理面板中看到的那样,无论如何都会创建对象公司和用户。我做错了什么,我该如何解决?

标签: djangodjango-rest-framework

解决方案


在这种情况下,您可以使用source字段的参数:

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

推荐阅读