gpt4 book ai didi

django - 如何使用 ToManyField 加快 Tastypie 的查询速度

转载 作者:行者123 更新时间:2023-12-03 15:34:20 25 4
gpt4 key购买 nike

在 resources.py 我有:

class CategoryResource(ModelResource):
items = fields.ToManyField('ItemResource', 'items', full=True, null=False, readonly=True, related_name='items')
class Meta:
queryset = Category.objects.all().order_by('id')
include_resource_uri = False
always_return_data = True
resource_name = 'category'

大约有 6 个类别的 5000 个项目。当我发出“列表”api 请求,即“api/1.0/category”时,它会对数据库进行大约 5000 次查询。我该如何优化它?我知道 full=False,但它不适合我的需要。

更新:
我发现是什么引起了如此多的查询。我在 ItemResource 中有“类别”关系,所以tastypie 为每个项目生成一个选择查询。
class ItemResource(ModelResource):
categories = fields.ToManyField(CategoryResource, 'categories', null=True, readonly=True)

def dehydrate_categories(self, bundle):
categories = Category.objects.filter(owner_id=bundle.request.user.id, items__item=bundle.obj)
return [category.name for category in categories]

显然,当我请求 CategoryResource 时,这是不必要的数据,有没有办法从查询中排除它?

最佳答案

尝试这个:

def get_object_list(self, request):
return super(CategoryResource, self).get_object_list(request) \
.prefetch_related('items', 'items__categories')

请勿使用 select_related ,因为它返回重复的行。
prefetch_related做了一个查询,返回所有项目,Django ORM 将其匹配到正确的行。

编辑

更改 dehydrate_categories
def dehydrate_categories(self, bundle):
return [category.name for category in bundle.obj.categories.all() if category.owner == bundle.request.user]

关于django - 如何使用 ToManyField 加快 Tastypie 的查询速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34841379/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com