Использование встроенных методов запроса django - PullRequest
1 голос
/ 07 февраля 2020

У меня есть метод, который вычисляет следующее. Можем ли мы использовать здесь select_related или какую-либо оптимизацию?

obj = []
for game in Games.objects.filter(query__health=health,created_at__gte=start_date.replace(month=month_to_consider,year=year_to_consider)).distinct().order_by('-created_at'):
 data={}
 data["problem"] = game.issue.issue if game.issue else ""
 data["game_name"]=game.name
 obj.append(data)

return obj

1 Ответ

1 голос
/ 07 февраля 2020

Основываясь на информации, которую вы предоставили, существует проблема с количеством попаданий в вашу базу данных, что дает вам возможность для улучшения.

Например, когда вы делаете PlCityAssociate.objects.filter(play__states__city=city..., вы звоните в штаты, а затем в города, которые соответствуют вашим критериям. Это 3 обращения к БД, каждый раз, когда вы go обращаетесь к нему в for l oop.

Метод create не создает ничего, что кажется странным, но я буду следить за этим. Возможно, вы пытаетесь показать список городов, принадлежащих пользователю, со статусом, равным A, B или C, и с клиентом.

def create(self, request, *args, **kwargs):
    queryset = City.objects.select_related('citystatus').filter(owner=request.user, citystatus__status__in=["A", "B", "C"], client_id__isnull=False)
    res = []
    for r in queryset:
        res.append(self.get_cities(r))
    return Response(res)

Django позволяет вам делать соединения на лету, используя select_related(), который вы можете найти больше информации здесь .

Вторая часть, метод get_cities(), который я включил бы в модель города, так что вы можете вызывать его для каждого экземпляра вместо того, чтобы запускать al oop через каждый набор запросов PlCityAssociate каждый раз.

Так что новый get_cities() метод внутри модели City будет выглядеть так это:

def get_cities(self ,city):
    start_date = datetime.datetime.now()
    pls = self.state_set.all().play_set.all().plcityassociate_set.filter(update_at__gte=start_date)

Дайте мне знать, достаточно ли этого улучшения. Кроме того, убедитесь, что вы тестировали количество попаданий в базу данных, есть несколько способов сделать это, но я предпочитаю django_assert_num_queries, который является частью pytest-django.

...