django - 预取相关提取的数据库行?
问题描述
我将此查询与 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
解决方案
推荐阅读
- github-pages - 如何在生产中删除 livereload?
- python - 是否检查 Python Set 常量时间中是否存在值?
- angular - 由于 API 响应延迟,Angular 9 Ngif 给出错误的输出
- python - 将csv作为坐标导入python
- mongodb - 可以通过 Robo 3T 身份验证连接到 mongoDB,但不能通过 Mac Catalina 上的 zsh CLI
- python - Python在某个字符之前删除字节串中的所有内容
- python - 经纬度密度图
- flowtype - 在 FreeBSD 上启动 flow-bin 时出现 Unix 异常
- python - 非大 O 表示法:由“和”连接的 2 个比较操作的时间复杂度是多少?
- php - htaccess 单页条目不提供静态文件