首页 > 解决方案 > 如何查询 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()
            )

标签: pythondjangodjango-rest-frameworkwagtailprefetch

解决方案


推荐阅读