Как объединить несколько наборов запросов в один и упорядочить их по времени создания?

I am learning Django and still a beginner. For practising, i am trying to make a demo social media website. In my project, users can create groups, then they can post and comment there. In the home page, i am trying to add a section like 'recent activities' where a user can see recent activities in that website like "John created a group 'Javascript', Tim posted a comment in 'Python', Sarah posted in 'CSS'" Now i have made some queries like: groups = Group.objects.all().order_by('-created')[0:5] posts = Post.objects.all().order_by('-created')[0:5] comments = Comment.objects.all().order_by('-created')[0:5]

Я хочу смешать их все в одном наборе запросов. Затем упорядочить их по времени создания. Я знаю, что это глупый вопрос, и я застрял здесь с самого утра. Не могли бы вы помочь мне и показать процесс?

Вы можете соединить их в цепочку и упорядочить по полю created с помощью:

from operator import attrgetter

groups = Group.objects.order_by('-created')[:5]
posts = Post.objects.order_by('-created')[:5]
comments = Comment.objects.order_by('-created')[:5]
all_items = sorted(
    [*groups, *posts, *comments],
    key=attrgetter('created'),
    reversed=True
)

Теперь all_items представляет собой гетерогенный список с различными типами объектов. Это немного усложнит процесс рендеринга, так как comment, вероятно, имеет другие поля, чем, например, Post.

Вы также можете использовать функцию chain из модуля itertools для объединения наборов запросов и последующей сортировки в обратном порядке, используя поле created в качестве ключа.

from itertools import chain

groups = Group.objects.all()[0:5]
posts = Post.objects.all()[0:5]
comments = Comment.objects.all()[0:5]

queryset = sorted(
    chain(groups, posts, comments),
    key=lambda instance: instance.created,
    reverse=True
)
Вернуться на верх