Python Django 保存帖子的计算方法

假设我使用默认的 django 模型、一个 Post 模型(下面的代码)和一个将用户链接到帖子的 SavedPost 模型(如果存在特定帖子的特定用户,则为该用户保存该帖子)以及一个 Follower 模型链接 2 个用户(类似于 SavedPost)。


我想要做什么:一个 API,对于用户来说,他们可以获得他们关注的用户的所有帖子,此外,每个帖子都有一个额外的“字段”来说明该帖子是否保存。


class Post(models.Model):

    user = models.ForeignKey(User, on_delete=models.CASCADE)

    post_type = models.CharField(max_length=1, choices=[('B', 'Blog'), ('V', 'Video')], default='B')

    file_path = models.URLField(null=True)

    title = models.CharField(max_length=255)

    description = models.TextField()

    created_at = models.DateTimeField(auto_now_add=True)

    updated_at = models.DateTimeField(auto_now=True)


class SavedPost(models.Model):

    user = models.ForeignKey(User, on_delete=models.CASCADE)

    post = models.ForeignKey(Post, on_delete=models.CASCADE)

    created_at = models.DateTimeField(auto_now_add=True)


    class Meta:

        # A user can save a post only once.

        unique_together = ('user', 'post')


class Follower(models.Model):

    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="user")

    follower = models.ForeignKey(User, on_delete=models.CASCADE, related_name="follower")

    created_at = models.DateTimeField(auto_now_add=True)


    class Meta:

        # A user can follow another user only once

        unique_together = ('user', 'follower')

后序列化器:


class PostSerializer(serializers.ModelSerializer):

    """

    Nested serializer for post using SimpleUser and Kingdom.

    """


    class Meta:

        model = Post

        fields = ('id', 'user', 'post_type', 'file_path',

                  'title', 'description', 'created_at', 'updated_at')


    def to_representation(self, instance):

        data = super().to_representation(instance)

        data['user'] = UserSerializer(

            User.objects.get(pk=data['user'])).data

        return data


到目前为止,根据我所做的视图,我可以获得 request.user 关注的所有帖子,但没有说明它们是否已保存。我正在寻找帖子上的“is_saved”布尔值来表示该帖子是否已为该用户保存。


任何帮助/方法来做到这一点表示赞赏。谢谢。


炎炎设计
浏览 96回答 2
2回答

MMMHUHU

用作serializers.SerializerMethodField_class PostSerializer(serializers.ModelSerializer):    is_saved = serializers.SerializerMethodField()    def get_is_saved(self, post_instance):        return SavedPost.objects.filter(user=post_instance.user, post=post_instance).exists()    class Meta:        model = Post        fields = ['id', 'user', 'post_type', 'file_path',                  'title', 'description', 'created_at', 'updated_at', 'is_saved']    def to_representation(self, instance):        data = super().to_representation(instance)        data['user'] = UserSerializer(            User.objects.get(pk=data['user'])).data        return data

慕森卡

首先,需要明确的是,我将定义srelated_name的选项- 由您决定是否实现此选项:ForeignKeySavedPostclass SavedPost(models.Model):    user = models.ForeignKey(User, related_name="saved", on_delete=models.CASCADE)    post = models.ForeignKey(Post, related_name="saved", on_delete=models.CASCADE)    ...现在,在您的 中PostSerializer,您可以添加此字段(请记住将其添加到内部类fields中的变量中Meta- 也就是说,如果您正在使用ModelSerializer):class PostSerializer(serializers.ModelSerializer):    saved = SavedPostSerializer(many=True)    ...要完成它,请定义您的SavedPostSerializer- 上面PostSerializer(如果在同一文件/模块中):class SavedPostSerializer(serializers.ModelSerializer):    class Meta:        model = SavedPost        fields = "__all__"这样,您的 json 应该有一个嵌套字段,其中的saved键包含 s 数组SavedPost(如果有任何与Post检索到的 s 相关的内容)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python