【问题标题】:Getting attribute error when trying to access the nested serializer in Django Rest Framework尝试访问 Django Rest Framework 中的嵌套序列化程序时出现属性错误
【发布时间】:2016-01-17 08:20:06
【问题描述】:

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

尝试获取字段值时出现 AttributeError full_name 在序列化程序 UserSerializer 上。序列化器字段可能 命名不正确且与long 上的任何属性或键不匹配 实例。原始异常文本是:“长”对象没有属性 '全名'。

序列化器如下:

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

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    问题

    在序列化程序 UserSerializer 上尝试获取字段 full_name 的值时出现 AttributeError。

    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
    

    【讨论】:

    • 我已经指定了我的自定义用户模型并更新了有问题的模型。所以,我认为它仍然不需要。我仍然尝试使用您的解决方案,但出现以下错误:
    • 错误:长对象没有属性用户名是的,用户模型是正确的,因为相同的序列化程序正在为用户 API 工作
    • 用户名字段错误表明所有用户字段都有问题。
    • 我只在 UserSerializer 中包含了用户名。我也提到了视图代码。我认为用户序列化程序没有收到任何类型的用户信息。如果是这样,请帮助我如何将其传递给 UserSerializer。
    • 同时检查 Django 是否使用您的自定义模型,settings.AUTH_USER_MODEL = 'myapp.User'
    【解决方案2】:

    或者只是

    class UserSerializer(serializers.ModelSerializer):
        class Meta:
            model = User
            fields = ('id', 'username', 'first_name', 'last_name')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-20
      • 1970-01-01
      • 2019-01-29
      • 2015-06-18
      • 1970-01-01
      • 2015-06-01
      • 1970-01-01
      • 2015-12-16
      相关资源
      最近更新 更多