Django DRF序列化程序错误:AttributeError:';FeedPostSerializer';对象没有属性';授权用户';

Django DRF序列化程序错误:AttributeError:';FeedPostSerializer';对象没有属性';授权用户';,django,django-rest-framework,serialization,Django,Django Rest Framework,Serialization,我正在应用程序中创建新闻源 用户已登录并看到其他用户的发布。 因此,我需要两个用户模型(user+auth\u users) 现在我想添加一个布尔字段,显示一篇文章是否已经被喜欢 我已经看过这里的文档和其他帖子,但我找不到解决方案。 响应中显示了auth\u user,但我无法将其包含在get\u ready\u like函数中 class NewsPostSerializer(serializers.HyperlinkedModelSerializer): user = UserSer

我正在应用程序中创建新闻源

用户已登录并看到其他用户的发布。 因此,我需要两个用户模型(
user
+
auth\u users

现在我想添加一个布尔字段,显示一篇文章是否已经被喜欢

我已经看过这里的文档和其他帖子,但我找不到解决方案。 响应中显示了
auth\u user
,但我无法将其包含在
get\u ready\u like
函数中

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',
        )
更新: 在另一个例子中,我找到了一个解决办法。我的代码现在看起来像这样,并且可以工作:

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,我会稍微改变一下这里的方法。对于like计数器,我会在数据库中使用类似模型的东西,它有一个外键指向图片,另一个外键指向用户,有了外键,您可以使用模型之间的反向关系。例如:

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')


因此,我建议在用户的模型中插入like的计数器,然后您可以在序列化程序中使用它。

您的
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

嗨,马可,首先谢谢你的回答!我已经有一个喜欢的模型了<代码>类LikePost(models.Model):user=models.ForeignKey(user,related\u name='like\u post\u user',on\u delete=CASCADE,null=True)post=models.ForeignKey(post,related\u name='like\u post',on\u delete=CASCADE,null=True)time\u stamp=models.datetime字段(auto\u now=True)My probelm当前的问题是获取正在使用并希望接收feedHi的用户的ID,感谢您在这方面的支持!我尝试了您的解决方案,但出现了以下问题:“Post”对象没有属性“auth_user”,请求不包含任何值。我最大的问题是获取auth_user。当我硬编码所有ID时,一切都正常
Post
对象没有属性
auth\u user
,因为您提到它是meta类中的
只读字段。request.data应该包含这些,我已经对此进行了评论。如果你发布数据的话。request.data.get('auth_user')应该包含auth_user.Hi Shaki,感谢您的快速响应。我试了你的建议。”request.data.get('auth_user')为我提供的是None,而不是用户idfirst-remove
auth_user
from
read_-only\u fields
。你能用post数据(可能是邮递员的屏幕截图)和你的更新代码更新你的问题吗。这将帮助我们指出故障。嗨,Shakil。我找到了解决办法。请看更新后的帖子。谢谢你的支持!