首页 > 解决方案 > 预取相关提取的数据库行?

问题描述

我将此查询与 DRF 一起使用:

def get(self, request, format=None):
        show = Show.objects.prefetch_related(
            Prefetch(
                'posttitleimage_set',
                queryset=PostTitleImage.objects.filter(post__is_published=True),
            )
        ).exclude(publication__isnull=False)[:5]

但是,这应该只shows从数据库中获取 5。此外,我永远不会遇到posttitleimages一场演出需要全部的情况。我只想要posttitleimage一个节目的最新消息。

class ShowIndexSerializer(serializers.ModelSerializer):
    last_title_image = serializers.SerializerMethodField()

    class Meta:
        model = Show
        fields = (
            ....
            'last_title_image',
        )

    def get_last_title_image(self, obj):
        last_published_image = obj.posttitleimage_set.all()[: 1]
        return ShallowPostTitleImageSerializer(last_published_image, many=True).data

虽然我的代码设法将查询数量从 10 个减少到只有 4 个,但我现在担心这将从数据库中查询的行数。特别是一旦数据库增长。posttitleimage此外,这似乎是一个从数据库中获取最新信息的 hacky 解决方案。此实现是否存在一些明显的缺陷。如何改进?我会非常高兴的建议。


编辑:

class ShallowPostTitleImageSerializer(ModelSerializer):
    class Meta:
        model = PostTitleImage
        fields = (
            'uuid',
            'image',
            'show',
        )

Method 字段的 get_last_title_image 函数的两个版本:

首先(导致 9 个查询)

def get_last_title_image(self, obj):
    published_image = obj.posttitleimage_set.first()
    return ShallowPostTitleImageSerializer(published_image).data

第二(仅导致 4 个查询):

def get_last_title_image(self, obj):
    published_images = obj.posttitleimage_set.all()
    if published_images:
        return ShallowPostTitleImageSerializer(published_images[len(published_images) - 1]).data
    return None

标签: djangodjango-rest-framework

解决方案


推荐阅读