Как ускорить выполнение запросов для больших записей в Django, если мы обращаемся к нескольким классам для достижения этой цели?
Я пытаюсь показать профили пользователей, предлагаемые для вошедшего в систему пользователя на основе тегов, которые он/она посещает. В моем случае я должен обратиться к классу User_Interests_Tag, чтобы получить все теги, затем посетить класс Post_Tag, чтобы получить все посты для каждого из тегов (цикл), как только у меня есть все PostId'ы, посетить класс Post, чтобы получить каждого уникального пользователя и добавить его в профиль (список) и использовать paginator для ограничения профилей, отправляемых клиенту. Как я могу достичь этого без использования циклов for для увеличения общей эффективности и времени отклика сервера?
вот сниппет, чего я хочу добиться :
#looping through each tag
for user_interests_tag in user_interests_tags:
#user_post_tags = Post_Tag.objects.in_bulk(user_interests_tags) (used bulk but no luck)
user_post_tags.extend(list(Post_Tag.objects.filter(tag_id = user_interests_tag).values_list('post_id', flat=True)))
profiles = []
#looping through each tag id
for user_post_tag in user_post_tags:
#getting the user from post class
user = Post.objects.get(id = user_post_tag)
#checking if already follows and if already their in user profiles array
if user not in profiles and not User_Follow.objects.filter( owner_id = user_id.id, user_id = user.user_id):
profiles.append(user)
#paginating 6 per request
paginator = Paginator(profiles,6)
limited_profiles = paginator.page(page)
return limited_profiles
Любая информация очень ценится, спасибо заранее :)
Вы можете сделать что-то вроде этого:
posts = Post.objects.filter(
Q(post_tag_set__tag__in=user_interests_tags)
& ~Q(user__in=User_Follow.objects.filter(owner_id=user_id.id).values('user'))
).distinct()
paginator = Paginator(posts, 6)
limited_profiles = paginator.page(page)
return limited_profiles
Подробнее об этом:
Q(post_tag_set__tag__in=user_interests_tags)
Вышеуказанное отфильтрует все Post
, которые имеют Post_Tag
с Tag
, совпадающие с user_interests_tags
.
~Q(user__in=User_Follow.objects.filter(owner_id=user_id.id).values('user'))
Вышеуказанное также отфильтрует Post
с user
, которые не соответствуют ни одному User_Follow
объекту на основе фильтра id владельца, который у вас сейчас есть.