Skip to main content
 首页 » 编程设计

python之尝试访问 Django Rest Framework 中的嵌套序列化程序时出现属性错误

2025年05月04日29freeliver54

我在使用 PostSerializer 时遇到以下错误:

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

序列化器如下:

class PostSerializer(serializers.ModelSerializer): 
    author = UserSerializer(required=False, allow_null=True) 
    class Meta: 
        model = Post 
        fields = ('id', 'author', 'message', 'rating', 'create_date', 'close_date',) 
 
class UserSerializer(serializers.ModelSerializer): 
   class Meta: 
       model = User 
       fields = ('id', 'username', 'full_name',) 

查看:

class PostMixin(object): 
    model = Post 
    serializer_class = PostSerializer 
    permission_classes = [ 
        PostAuthorCanEditPermission 
    ] 
    queryset = model.objects.all() 
 
    def pre_save(self, obj): 
        """Force author to the current user on save""" 
        obj.author = self.request.user 
        return super(PostMixin, self).pre_save(obj) 
 
 
class PostList(PostMixin, generics.ListCreateAPIView): 
    pass 

用户模型:

class User(AbstractBaseUser): 
    email = models.EmailField(unique=True) 
    username = models.CharField(max_length=40, unique=True, null=True) 
    full_name = models.CharField(max_length=50, blank=False) 
    phone = models.CharField(max_length=20, unique=True, null=True) 
    about = models.CharField(max_length=255, blank=True) 
    type = models.CharField(max_length=1, default='U') 
    is_active = models.BooleanField(default=True) 
    date_joined = models.DateTimeField(auto_now_add=True) 
 
    objects = UserManager() 
 
    USERNAME_FIELD = 'email' 
    REQUIRED_FIELDS = ['full_name'] 
 
    def __unicode__(self): 
        return self.email 
 
    def get_full_name(self): 
        return self.full_name 
 
    def get_short_name(self): 
        return self.full_name 

请您参考如下方法:

问题

Got AttributeError when attempting to get a value for field full_name on serializer UserSerializer.

Django 中的模型User 没有名为full_name 的字段。 虽然有一个方法 get_full_name() 可以满足您的需求。

解决方案

所以尝试通过 SerializerMethodField 使用它

class UserSerializer(serializers.ModelSerializer): 
   class Meta: 
       model = User 
       fields = ('id', 'username') # no full_name here 
 
   full_name = serializers.SerializerMethodField('get_full_name') 

这将向您的序列化对象添加一个名为 full_name 的字段,其值来自 User.get_full_name()

检查您使用的是自定义模型而不是 Django 的用户模型

您已经自定义了您自己的User 模型,但由于该模型具有full_name,您一开始就不应该得到该错误,因此请仔细检查您没有首先引用 Django 的默认 User 模型。

class UserSerializer(serializers.ModelSerializer): 
   class Meta: 
       model = User # <--- Make sure this is your app.models.User, 
                    # and not Django's User model 
       fields = ('id', 'username', 'full_name',) # This is OK on your User model