Как ускорить выполнение запросов для больших записей в 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 владельца, который у вас сейчас есть.

Вернуться на верх