我在使用 PostSerializer 时遇到以下错误:
Got AttributeError when attempting to get a value for field
full_nameon serializerUserSerializer. The serializer field might be named incorrectly and not match any attribute or key on thelonginstance. 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
