Основываясь на информации, которую вы предоставили, существует проблема с количеством попаданий в вашу базу данных, что дает вам возможность для улучшения.
Например, когда вы делаете 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
.