python - 使用 DRF 时 API 响应时间太慢

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

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

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})

最佳答案

正如所写,Python 正在进行单独的数据库查询,以获取数据库中每个 activity_numactivity_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)

关于python - 使用 DRF 时 API 响应时间太慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58298166/

相关文章:

Django:从 Pandas 到 Django Rest Framework 的模型查询集

python - 为用户 auth django 创建用户配置文件

python - 如何为作为服务运行的 Python 脚本提供输入

python - Heroku:使用 flask 连接错误设置redis和redisco

python - 在 Web2py 上显示文件夹中的一组图像

mysql - 在 Django 中通过跨不同应用程序的 OneToOneField 重置数据库

django-rest-framework - Django 使用 Allauth 进行休息验证

python - 使用 BlobServiceClient 和 Python V12 SDK 将本地文件夹上传到 Azure Blob 存储

python - 我在哪里可以获得 Django 应用程序的 wiki 格式化小部件?

django - 更改 CreateView 和 UpdateView 中使用的表单的 <input> 类型和属性