DRF 序列化程序错误:AttributeError:“FeedPostSerializer”对象没有属性“auth_user”

Posted

技术标签:

【中文标题】DRF 序列化程序错误:AttributeError:“FeedPostSerializer”对象没有属性“auth_user”【英文标题】:DRF Serializer Error: AttributeError: 'FeedPostSerializer' object has no attribute 'auth_user' 【发布时间】:2020-01-12 08:11:38 【问题描述】:

我正在 APP 中创建新闻源。

一个用户登录并看到其他用户的帖子。 因此我需要两个用户模型(user + auth_users

现在我想添加一个布尔字段来显示帖子是否已被点赞。

我已经查看了此处的文档和其他帖子,但找不到解决方案。 auth_user 显示在响应中,但我不能将它包含在 get_already_liked 函数中

class NewsPostSerializer(serializers.HyperlinkedModelSerializer):
    user = UserSerializer(read_only=True)
    auth_user = serializers.PrimaryKeyRelatedField(
        read_only=True,
        default=serializers.CurrentUserDefault()
    )
    attachments = AttachmentSerializer(read_only=True, many=True)
    already_liked = serializers.SerializerMethodField()

    def get_already_liked(self, request):
        liking_kwargs = 
            'post_id': request.id,
            'user_id': self.auth_user
        
        if LikePost.objects.filter(**liking_kwargs).exists():
            return True
        else:
            return False

    class Meta:
        model = Post
        read_only_fields = (
            'id', "user", 'creation_time_stamp', 'auth_user', 'ready_liked',
        )
        fields = (
            'id', 'user', 'creation_time_stamp', 'last_update_time_stamp',
            'description', 'attachments', 'already_liked', 'auth_user',
        )

更新: 在另一个post 中,我找到了解决方案。我的代码现在看起来像这样并且可以工作:

class NewsPostSerializer(serializers.HyperlinkedModelSerializer):
    user = UserSerializer(read_only=True)
    attachments = PostAttachmentSerializer(read_only=True, many=True)
    already_liked = serializers.SerializerMethodField()

    def get_already_liked(self, obj):
        user = self.context['request'].user.id
        liking_kwargs = 
                    'post_id': obj.id,
                    'user_id': user
        
        if LikePost.objects.filter(**liking_kwargs).exists():
            return True
        else:
            return False

    class Meta:
        model = Post
        read_only_fields = (
            'id', "user", 'creation_time_stamp', 'attachments', 'already_liked',
        )
        fields = (
            'id', 'user', 'creation_time_stamp', 'last_update_time_stamp',
            'description', 'attachments', 'already_liked',
        )

感谢 Marco 和 Shakil

【问题讨论】:

【参考方案1】:

我会稍微改变一下这里的方法。对于类似的计数器,我会使用数据库中的模型之类的东西,该模型具有图片的外键和用户的另一个外键,您可以使用模型之间的反向关系。例如:

class Post(models.Model):
    ...
    ...

    def number_of_likes(self):
        return len(self.likes.all())  # dont know if sintax is right, but the idea is to get all the instance of likes that is related to this post. (reverse relation)


class Like(models.Model):

    post = models.ForeignKey(Post, on_delete=models.CASCADE ,related_name='likes')
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='all_likes')

所以,我建议在用户模型中插入点赞计数器,然后您可以在序列化程序中开始使用它。

【讨论】:

嗨,Marco,首先感谢您的回答!我已经有一个喜欢的模型了。 class LikePost(models.Model): user = models.ForeignKey(User, related_name='like_post_user', on_delete=CASCADE, null=True) post = models.ForeignKey(Post, related_name='like_post', on_delete=CASCADE, null=True) time_stamp = models.DateTimeField(auto_now=True)我的problem目前是获取登录并希望接收feed的用户的ID【参考方案2】:

您的serializerMethodField 的论点是错误的。应该是这样的

def get_already_liked(self, obj):
        request = self.context.get('request')
        liking_kwargs = 
            'post_id': request.id, // I have a doubt, is this request.data['id'] 
            'user_id': obj.auth_user
        
        if LikePost.objects.filter(**liking_kwargs).exists():
            return True
        else:
            return False

【讨论】:

您好,感谢您对此的支持!我尝试了您的解决方案,但出现了以下问题: 'Post' 对象没有属性 'auth_user' 并且请求不包含任何值 我最大的问题是获取 auth_user。当我对所有 ID 进行硬编码时,一切正常 Post 对象没有属性auth_user,因为您提到它是元类中的read_only_fields。 request.data 应该包含那些,我已经对此发表了评论。如果您发布数据,那么 . request.data.get('auth_user') 应该包含 auth_user。 嗨,Shaki,感谢您的快速回复。我尝试了你的建议。 ' request.data.get('auth_user') ' 给我 None 而不是用户 ID 首先从read_only_fields 中删除auth_user。您能否使用帖子数据(可能是邮递员的屏幕截图)和更新的代码来更新您的问题。这将有助于我们指出错误。 嗨沙基尔。我找到了解决方案。请查看更新后的帖子。感谢您的支持!

以上是关于DRF 序列化程序错误:AttributeError:“FeedPostSerializer”对象没有属性“auth_user”的主要内容,如果未能解决你的问题,请参考以下文章

在 DRF 中获取序列化程序列表时出现 TypeError

08.DRF-反序列化

drf的序列化器

Django 表单验证与 DRF 序列化程序验证

DRF:使用嵌套序列化程序的简单外键分配?

DRF:Djoser 覆盖自定义用户序列化程序