如何解决Python Django保存的帖子计算方法
假设im使用默认的django模型,一个Post模型(下面的代码)和一个将用户链接到Post的SavedPost模型(如果存在具有特定帖子的特定用户,则该帖子将为该用户保存)和链接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,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
API视图:
@permission_classes([IsAuthenticated,])
@api_view(['GET'])
def get_following(request):
user = request.user
following = Follower.objects.filter(follower=user).values('user')
# saved_posts = SavedPost.objects.filter(user=user,post__user__in=following).order_by('-post__created_at')
posts = Post.objects.filter(user__in=following).order_by('-created_at')
serializer = PostSerializer(posts,many=True,context={'request': request})
return JsonResponse(serializer.data,safe=False)
到目前为止,我做出的视图可以获取request.user遵循的所有帖子,但没有说明是否保存。我在帖子中寻找说“ is_saved”的布尔值,以表示该帖子是否为该用户保存。
任何帮助/方法做到这一点表示赞赏。谢谢。
解决方法
将 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
,
首先,为了清楚起见,我将为related_name
中的ForeignKey
定义SavedPost
选项-由您决定是否实施此选项:
class SavedPost(models.Model):
user = models.ForeignKey(User,related_name="saved",on_delete=models.CASCADE)
post = models.ForeignKey(Post,on_delete=models.CASCADE)
...
现在,您可以在PostSerializer
中添加此字段(请记住,将其添加到fields
内部类的Meta
变量中-也就是说,如果您使用的是{{ 1}}):
ModelSerializer
要完成此操作,请在class PostSerializer(serializers.ModelSerializer):
saved = SavedPostSerializer(many=True)
...
上方定义您的SavedPostSerializer
-如果在同一文件/模块中:
PostSerializer
有了这个,您的json应该有一个嵌套字段,其中的class SavedPostSerializer(serializers.ModelSerializer):
class Meta:
model = SavedPost
fields = "__all__"
键包含一个saved
数组,如果与检索到的SavedPost
相关的话。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。