python - 如何查询 Wagtail 标签而不创建数百个查询,n+1 问题?
问题描述
我有一些条目,每个条目都有几十个“标签”,当我尝试获取这些数据时,它会导致数百个查询。虽然在我的所有其他模型和链接上使用预取,但它似乎不适用于此。下面的帖子说它有一些与 wagtails 假查询功能相关的东西,但尚未修复。有没有办法利用标签,我可以通过 api 获取它们,这样它们就不会创建数百个查询(每个标签一个),因为它们的响应时间很慢而使它们无法使用?
您可以提供的任何帮助将不胜感激。
这里提出了一个类似的问题,但没有得到答案 如何预取 Wagtail 帖子标签?
此外,当我使用预取时,它实际上使查询数量增加了一倍
这是我的代码:
# serializer.py////////////////////////////////////
# orderable models links
# Custom searializers to add custom display fields
class EventCollectionSerializer(serializers.ModelSerializer):
class Meta:
model = CategoryEventCollection
fields = ['id', 'collection_name', 'collection_event']
class TagSerializer(serializers.ModelSerializer):
class Meta:
model = Tag
fields = ['name', 'id']
# MAIN SERIALIZER PRIMARY FOCUS
class PrimaryFocusSerializer(serializers.HyperlinkedModelSerializer):
# assign fields to custom serializer
event_collection = EventCollectionSerializer(many=False)
tags = TagSerializer(many=True)
class Meta:
model = PrimaryFocus
fields = ['id',
'event_collection',
'title_major',
'synopsis',
'level_ability',
'page_count',
'reading_category',
'book_image',
'author_first_name',
'author_last_name',
'author_dob',
'tags',
'purchase_link',
'source',
]
# PRIMARY FOCUS VIEWSET//////////////////////////////////
class PrimaryFocusViewSet(viewsets.ModelViewSet):
# This snippet just console logs how many queries
def dispatch(self, *args, **kwargs):
response = super().dispatch(*args, **kwargs)
print('Queries Counted: {}'.format(len(connection.queries)))
return response
# fetch all lexis items to setup queryset
queryset = PrimaryFocus.objects.all()
# set serializer class
serializer_class = PrimaryFocusSerializer
# optimize query with select related and prefetching
def get_queryset(self):
return (PrimaryFocus.objects
.select_related('event_collection',)
.prefetch_related('tags', )
.all()
)
解决方案
推荐阅读
- mysql - 尝试将 laravel 连接到 mysql,但我不断收到错误消息
- python - 文本中的 Python pygame alpha
- ibm-cloud - IBM Watson Assistant:如何提出一系列问题并存储相关答案?
- json - 如何通过 JSON 将动态默认下载目录属性设置为 ChromeDriver?
- python - 带文字的水印图片
- java - Google 阻止我的 java 应用程序发送邮件(JavaMail)。com.sun.mail.util.MailConnectException:无法连接到主机,端口:smtp.gmail.com
- ios - Ios 构建错误 - 无法编写 Gemfile.lock - Expo React Native
- python - 张量流中 model.fit() 中的值错误
- java - 检查 AmazonS3Client 连接是否处于活动状态
- python - 回文比较未检测到某些情况