为了账号安全,请及时绑定邮箱和手机立即绑定

Python Django 保存帖子的计算方法

Python Django 保存帖子的计算方法

炎炎设计 2023-07-18 15:53:24
假设我使用默认的 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”布尔值来表示该帖子是否已为该用户保存。任何帮助/方法来做到这一点表示赞赏。谢谢。
查看完整描述

2 回答

?
MMMHUHU

TA贡献1834条经验 获得超8个赞

用作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


查看完整回答
反对 回复 2023-07-18
?
慕森卡

TA贡献1806条经验 获得超8个赞

首先,需要明确的是,我将定义srelated_name的选项- 由您决定是否实现此选项:ForeignKeySavedPost


class 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 相关的内容)。


查看完整回答
反对 回复 2023-07-18
  • 2 回答
  • 0 关注
  • 74 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信