Я использую 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. Возможно ли это?