Время отклика API слишком низкое при использовании DRF - PullRequest
1 голос
/ 09 октября 2019

Активность - это информация о туристе, а тег (Предпочтение) - это информация тега (например, хэш-тег Instagram).

Функция api Activity ListPreference: для каждого действия убедитесь, что каждое действие содержит теги из списка запросов. Сериализуются только те действия, которые содержат теги.

Но это слишком медленно. Это занимает около 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})

1 Ответ

0 голосов
/ 09 октября 2019

Как написано, Python делает отдельный запрос к базе данных, чтобы получить activity_preference_items для каждого activity_num в базе данных. Затем результаты используются для выполнения фильтрации в 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...