如何在不创建数百个查询的情况下查询Wagtail标记,n+1问题?

2024-09-26 22:51:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我有几个条目,每个条目都有几十个“标记”,当我试图获取这些数据时,它会导致数百次查询。虽然在我所有的其他模型和链接上都可以使用预取,但在这方面似乎不起作用。下面的帖子说它与wagtails伪查询功能有关,但尚未修复。有没有一种方法可以利用标记,我可以通过api获取它们,这样它们就不会创建数百个查询(每个标记一个查询),因为响应时间慢而无法使用

如果您能提供任何帮助,我们将不胜感激

这里提出了一个类似的问题,但没有得到答案 How to prefetch Wagtail post tags?

另外,当我使用预取时,它实际上使查询的数量增加了一倍

这是我的密码:

# 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()
            )

Tags: toname标记eventidfieldsmodeltags

热门问题