Использование оператора LIMIT SQL в Djna go prefetch_related - Prefetch - PullRequest
0 голосов
/ 17 июня 2020

Я использую Django и Django -Rest-Framework, и у меня есть эти две модели:

class Post(models.Model):
    ... some fields...

class PostImage(models.Model):
    ... some fields...
    post = models.ForeignKey(Post, verbose_name=_('post'), related_name='gallery', on_delete=models.CASCADE)

Мои сериализаторы для получения списка сообщений:

class PostSerializer(serializers.ModelSerializer):

    gallery = PostImageSerializer(many=True)
    .... additional fields ....

    class Meta:
        model = Post

И мой взгляд:

class PostListAPIView(generics.ListAPIView):

    serializer_class = PostSerializer

    def get_queryset(self):

        app = self.request.app
        qs = Post.objects.prefetch_related(
                Prefetch('gallery', queryset=PostImage.objects.order_by('order')))\
            .select_related('...')\
            .filter(application=app, status_type=PostStatusType.ACTIVE)\
            .order_by('-publication_date')
        return qs

Все работает нормально. Обратите внимание, что я использовал prefetch_related и select_related для улучшения запросов.

Теперь я хотел бы, чтобы для каждого сообщения было только первое изображение (а не вся галерея). Итак, мне нужно получить только первое изображение. Я могу установить это ограничение в свой сериализатор, используя, например, что-то вроде этого:

image = serializers.SerializerMethodField()

и

def get_image(self, obj):
    return PostImageSerializer(obj.gallery.first()).data

Но я думаю, что, используя этот подход, я не могу использовать оператор LIMIT SQL для prefetch_related - Prefetch. По сути, в этом случае я извлечу все связанные изображения, а в сериализатор я могу взять только первое.

Но я хотел бы улучшить запрос, используя LIMIT. Возможно ли это?

...