red*_*shq 8 python django prefetch django-rest-framework wagtail
当我尝试获取导致数百个查询的数据时,我有一些条目,每个条目都有数十个“标签”。虽然使用预取适用于我所有的其他模型和链接,但它似乎不适用于此。下面的帖子说它与 wagtails 假查询功能有关,但尚未修复。有没有办法利用标签,我可以通过 api 获取它们,这样它们就不会创建数百个查询(每个标签一个),使它们由于响应时间慢而无法使用?
您能提供的任何帮助将不胜感激。
这里提出了一个类似的问题,但没有答案 如何预取 Wagtail 帖子标签?
此外,当我使用 prefetch 时,它实际上使查询数量增加了一倍
这是我的代码:
# 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()
)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
294 次 |
| 最近记录: |