【问题标题】:API response time is too slow using DRF使用 DRF 的 API 响应时间太慢
【发布时间】:2019-10-09 06:25:44
【问题描述】:

Activity是旅游信息,tag(Preference)是标签信息(比如Instagram hash tag)。

Activity ListPreference api的功能: 对于每个活动,检查每个活动是否包含请求列表中的标签。只有包含标签的活动才会被序列化。

但是太慢了。大约需要 1 分钟。

返回所有活动的api只需要2秒。

有什么问题?

class ActivityListByPreference(APIView):
    permission_classes = (permissions.AllowAny,)
    def get(self, request):
        request_tag = [6, 7, 8]
        activity_list = []
        activity_items = Activity.objects.filter()
        activity_nums=activity_items.values_list('num', flat=True)
        b=1
        for activity_num in activity_nums:
            print(activity_num)
            activity_preference_items = Activity_Preference.objects.filter(activity_num_id=activity_num)
            activity_tag = []
            preference_nums= activity_preference_items.values_list('preference_num_id',flat=True)
            activity_tag=list(preference_nums)

            intersection = set([])
            intersection = set(request_tag).intersection(set(activity_tag))
            inter_list = list(intersection)
            inter_list.sort()
            if (request_tag == inter_list):
                print('포함합니다.')
                activity_list.append(activity_num)
        activity_preference_items = Activity_Preference.objects.all()
        for activity_preference_item in activity_preference_items:
            activity_tag.append(activity_preference_item.preference_num_id)

        print('끝')
        data = Activity.objects.filter(pk__in=activity_list)
        serializer = ActivitySerializer(data, many=True)
        print(data)
        return Response({"ActivityListByPreference" : serializer.data})

【问题讨论】:

  • 您使用的是什么数据库引擎?另外,Activity.objects.all() 中有多少项(大约)?
  • 您对数据库的请求太多了。您至少达到了数据库中Activities 的数量。查看您的模型ActivityActivity_Preference 可能会很有用。在我看来,您没有使用正确的ForeignKey

标签: python django django-rest-framework restful-url


【解决方案1】:

正如所写,Python 正在对数据库中的每个 activity_num 进行单独的数据库查询以获取 activity_preference_items。然后将结果用于在 Python 中执行过滤。

为了加快这一速度,您需要使用较少数量的数据库查询进行更多过滤。

例如,.filter() 在 Django 中是惰性的,因此您可以链接多个过滤器,而 Django 最终仍将只运行一个数据库查询。这可以包括lookups that span relationships,因此根据您的型号,您将拥有如下内容:

def get(self, request):
    request_tag = [6, 7, 8]
    activity_items = Activity.objects.filter()
    for request_tag_item in request_tag:
        activity_items = activity_items.filter(preference=request_tag_item)
    data = activity_items
    serializer = ActivitySerializer(data, many=True)

【讨论】:

    猜你喜欢
    • 2021-06-25
    • 2018-01-07
    • 2017-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-12
    • 2013-05-22
    • 2021-12-13
    相关资源
    最近更新 更多