Как получить запрос пользователя без попадания в БД каждый раз в Django? - PullRequest
0 голосов
/ 11 октября 2019

Я создал несколько API блогов, но у меня возникла проблема.

В сериализаторе есть поле метода, которое возвращает запрос пользователю, понравился пост или нет. Проблема в том, что это поле попадает в пользовательскую БД при каждом возврате сообщения, что означает, что при возврате 1000 сообщений пользовательская БД будет попадать 1000 раз. Как я могу избежать этого? Первой идеей было назначить пользователю запроса что-то вроде глобальной переменной, но я не знаю, как это сделать.

это сериализатор

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

    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']

    def get_likes_count(self, instance):
        return instance.likes.count()

    def get_user_has_liked(self, instance):
        request = self.context.get('request')
     ***return instance.likes.filter(pk=request.user.pk).exists()***
     *******request.user.pk hits the DB.*********


    def get_comments_count(self, instance):
        return instance.comments.count()

Заранее спасибо.

1 Ответ

1 голос
/ 11 октября 2019

Используйте .annotate и Exists subqyery в наборе запросов, передаваемом в сериализатор, а затем настройте поля:

вызов сериализатора:

    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']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...