使用 DRF 的 API 响应时间太慢



活动是旅游信息,标签(偏好(是标签信息(如Instagram哈希标签(。

活动列表首选项 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 最后仍然只会运行一个数据库查询。这可能包括跨关系的查找,因此根据您的模型,您将拥有如下所示的内容:

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)

最新更新