在django中,如何获得请求用户查询而不必每次点击DB?

在django中,如何获得请求用户查询而不必每次点击DB?,django,django-rest-framework,Django,Django Rest Framework,我构建了一些博客API,但我遇到了一个问题 在序列化程序中,有一个方法字段返回请求用户是否喜欢文章。问题是每次返回帖子时,该字段都会命中用户DB,这意味着如果返回1000篇帖子,用户DB将被命中1000次。 我怎样才能避免这种情况?第一个想法是将请求用户分配给全局变量,但我不知道如何分配 这是序列化程序 类仪表板序列化程序(serializers.ModelSerializer): image=serializers.ImageField(允许\u null=True,使用\u url=True

我构建了一些博客API,但我遇到了一个问题

在序列化程序中,有一个方法字段返回请求用户是否喜欢文章。问题是每次返回帖子时,该字段都会命中用户DB,这意味着如果返回1000篇帖子,用户DB将被命中1000次。 我怎样才能避免这种情况?第一个想法是将请求用户分配给全局变量,但我不知道如何分配

这是序列化程序

类仪表板序列化程序(serializers.ModelSerializer):
image=serializers.ImageField(允许\u null=True,使用\u url=True)
likes\u count=serializers.SerializerMethodField(只读=True)
tags=TagSerializer(many=True,read_only=True)
用户\u有\u=serializers.SerializerMethodField(只读=True)
所有者=用户字段(只读=真)
comments=CommentsField(只读=True,多个=True,source='two\u最新的\u注释')
comments\u count=serializers.SerializerMethodField()
类元:
模型=博客
字段=['id'、'title'、'owner'、'likes\u count'、'user\u has\u liked',
‘图像’、‘视频’、‘标记’、‘创建后获取所用时间’,
“评论”、“评论数”]
排序=['created_at']
def get_LIKE_计数(自身、实例):
return instance.likes.count()
def get_用户_喜欢(自身、实例):
request=self.context.get('request')
***return instance.likes.filter(pk=request.user.pk).exists()***
*******request.user.pk点击数据库*********
def get_comments_count(自身、实例):
return instance.comments.count()
提前感谢。

在传递给序列化程序的查询集上使用和,然后调整字段:

序列化程序调用:

    queryset = ...  # your queryset
    user_commented = Comment.objects.filter(
        blog_id=OuterRef("pk"),
        user_id=request.user.pk,
    )
    data = DashboardSerializer(instance=queryset.annotate(
        likes_count=Count("likes"),
        comments_count=Count("comments"),
        user_has_liked=Exists(user_commented),
    )
序列化程序:

class DashboardSerializer(serializers.ModelSerializer):
    image = serializers.ImageField(allow_null=True, use_url=True)
    likes_count = serializers.IntegerField(read_only=True)
    tags = TagSerializer(many=True, read_only=True)
    user_has_liked = serializers.BooleanField(read_only=True)
    owner = UserField(read_only=True)
    comments = CommentsField(read_only=True, many=True, source='two_latest_comments')
    comments_count = serializers.IntegerField(read_only=True)

    class Meta:
        model = Blog
        fields = ['id', 'title', 'owner', 'likes_count', 'user_has_liked',
                  'image', 'video', 'tags', 'get_elapsed_time_after_created',
                  'comments', 'comments_count']
        ordering = ['created_at']

每次都是什么意思?怎么可能不呢?你在说什么问题?为什么说“request.user.pk点击数据库”?在我看来,instance.likes.filter(pk=request.user.pk).exists()每次调用此方法时都会生成一个查询。在AuthenticationMiddleware中,每个请求都会获取一次
请求.user
。我的意思是,如果要返回上千个帖子,则每次调用get\u user\u has\u like时,该方法都会在DB中搜索用户pk。不是吗?不是。如果在列表端点上使用序列化程序,则每个用户将有一个查询。但是有多少帖子并不重要。从序列化程序的名称来看,它似乎不是针对列表视图的,因此它应该只是针对整个端点的一个额外查询,以查找该用户是否存在任何帖子。这种类型的查询速度非常快,因为它可以使用索引,如果找到一个索引,则只返回true,而不进行进一步搜索。由于您的问题很模糊,我在字里行间阅读了一些内容,但是这个序列化程序是否用于某种帖子列表?如果是这样的话,那么是的,每个帖子都会调用它,除了以某种方式缓存值之外,没有其他方法可以解决这个问题,这会导致数据过时的风险。但如前所述,这些查询速度非常快,不应该成为问题。。。除非您已经过基准测试,并且发现这个API的速度慢得令人无法忍受?