DRF序列化器错误:AttributeError:'FeedPostSerializer'对象没有属性'auth_user'

时间:2019-09-10 14:29:12

标签: django django-rest-framework serializer

我正在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

2 个答案:

答案 0 :(得分:0)

我会在这里稍微改变一下方法。对于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')

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

答案 1 :(得分:0)

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

serializerMethodField