Django оптимизировать повторяющийся запрос - PullRequest
1 голос
/ 05 мая 2020

Я новичок в Django, и ORM для меня немного сложен,

У меня есть страница поиска с запросом и несколькими фильтрами критериев, а get_queryset выглядит следующим образом (это app store):

def get_queryset(self):
        ... filter object list based on GET parameter...
        return object_list.annotate(
            rating=Avg('reviews__stars'),
            downloads=Count('order_history', distinct=True),
            flag1_rate=100*Count(
                'reviews',
                filter=Q(reviews__status=Review.FLAG1)
            ) / (Count(
                'reviews',
                filter=Q(reviews__status=Review.FLAG2)
            ) + Count(
                'reviews',
                filter=Q(reviews__status=Review.FLAG1)
            ))
        ).order_by(ordered_sort)

Как видите, я дважды запрашиваю Count из FLAG1 (не настоящее имя, но, как вы понимаете, я вычисляю соотношение между двумя флагами, которые пользователи указывают во время обзоров, используя 100*FLAG1/(FLAG1+FLAG2)):

Count(
     'reviews',
     filter=Q(reviews__status=Review.FLAG1)
) 

Как я могу предотвратить это? есть ли способ сохранить его в переменной для аннотации?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...