Как объединить несколько наборов запросов в один и упорядочить их по времени создания?
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
)