Как получить последние 3 книги от каждого автора, используя django - PullRequest
0 голосов
/ 17 апреля 2011

Используя следующие модели django:

class Author(models.Model):
   name = models.CharField(max_length=100)
   age = models.IntegerField()

class Book(models.Model):
    name = models.CharField(max_length=300)
    author = models.ForeignKey(Author)
    pubdate = models.DateField()
    class Meta:
        ordering = ('-pubdate')

Как я могу получить пять последних книг, опубликованных каждым автором ?

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

for a in Author.objects.all():
    books = Book.objects.filter(author = a )[:5]
    print books #and/or process the entries... 

Но, если в таблицах много записей (возможно, тысяч книг), это может быть медленным и неэффективным.

ТакЕсть ли другой способ сделать это с помощью Django (или SQL-запрос)?

Ответы [ 2 ]

2 голосов
/ 17 апреля 2011

Я бы предложил:

for a in Author.objects.all():
    books = a.book_set.all().order_by('-pub_date')[:5]
    print books #and/or process the entries... 

или, если порядок всегда должен быть одинаковым, как вы определяете Meta,

    books = a.book_set.all()[:5]

должен выполнить трюк

1 голос
/ 17 апреля 2011

Если вас беспокоит скорость запроса, создайте индекс в поле pubdate:

pubdate = models.DateField(db_index=True)

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

SQL в postgres будет выглядеть примерно так:

select b1.name, b1.author
from books b1
where b1.id in (
    select b2.id
    from books b2
    where b1.author = b2.author
    order by b2.pubdate desc
    limit 3)
order by b1.author, b1.name
...