Джанго: запрос последних сообщений из разных категорий - PullRequest
1 голос
/ 21 июня 2011
class Post(models.Model):
    title = ...
    category = models.ForeignKey(Category)
    date = .......

class Category(models.Model):
    title = ....

На главной странице я хочу отобразить 5 сообщений с самыми последними датами, но все сообщения должны быть из разных категорий.Есть 50 категорий, например.Возможно ли это?

Ответы [ 5 ]

6 голосов
/ 22 июня 2011
from django.db.models import Max

categories = Category.objects.annotate(most_recent=Max(post__date)).order_by('-most_recent')[:5]

posts = list()
for category in categories:
  posts.append(category.post_set.latest())

Это комментирует категории с датой самой последней публикации в качестве значения most_recent, которое затем можно заказать, чтобы получить 5 самых последних категорий.

Затем просто зациклимчерез категории и вытащить последний пост для каждого.Готово.

1 голос
/ 21 июня 2011

Хорошо, давайте попробуем это снова ..

catsused = {}
posts = {}
postindex = 0
posts.add(Post.objects.order_by('date')[postindex])
catsused.add(Post.objects.order_by('date')[postindex].category

for each in range(1,5):
    postindex = postindex + 1
    post = Post.objects.order_by('date')[postindex] 
    while post.category in catsused:
        postindex = postindex + 1
        post = Post.objects.order_by('date')[postindex] 
    posts.add(post)
    catsused.add(post.category)

posts ## Now contains your posts

Это кажется мне ужасным кодом, но я полагаю, что что-то близкое к этому подойдет. Вы хотите добавить некоторый код для обработки "postindex" с учетом количества постов в системе.

1 голос
/ 21 июня 2011

Вы держите пари, что это возможно.

Произвольно выберите 5 категорий

Получите самое последнее сообщение для каждой категории

Возможно что-то вроде:

randposts = {} #list for most recent posts of 5 randomly selected categories
for randomcat in Category.objects.order_by('?')[5:]:
    randposts.add(Post.objects.filter(category = randomcat).order_by('date')[0])

Это может помочь: https://docs.djangoproject.com/en/dev/ref/models/querysets/

0 голосов
/ 18 февраля 2015

Использование order_by и различно :

Post.objects.all().order_by('category', 'date').distinct('category')

Затем для производительности добавляем индекс вместе для полей category и date.

Но я думаю, что настоящий способ производства - это использовать Redis для кэширования и обновления списка идентификаторов последних сообщений категорий.

0 голосов
/ 21 июня 2011

Уточненная версия кода Дока:

catsused = {}
posts = {}

for post in Post.objects.order_by('date'):
    if post.category not in catsused:
        posts.add(post)
        catsused.add(post.category)
        if len(catsused) == 5:
            break
...