Комплексная группировка и средние в Джанго - PullRequest
4 голосов
/ 06 декабря 2011

У меня есть структура модели, подобная этой:

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

class Book(models.Model):
   published = models.DateTimeField()
   name = models.CharField(max_length=300, unique=True)
   authors = models.ForeignKey(Author)
   category = models.ForeignKey(Category)

class Category(models.Model):
   name = models.CharField(max_length=100)

Я хотел подсчитать Books по каждому автору. Это было легко, потому что я мог сделать: Author.objects.values('name').annotate(count=Count('book')).

У меня много трудностей при расчете:

  • количество уникальных категорий на автора.
  • среднее количество книг, написанных в категории автором
  • (Это сложный вопрос). Средняя продолжительность между первой и последней книгой, написанной автором в категории.

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

(Я знаю, что некоторые вещи в этом сценарии странные, например, уникальное ограничение имени автора, но это был лучший пример, который я нашел, чтобы проиллюстрировать мою проблему.)

Любая помощь о том, как я мог бы сделать это?

Спасибо.

1 Ответ

2 голосов
/ 08 декабря 2011

Ой, сложные.

Так как это не та информация, которую вам часто нужно обновлять, я бы посоветовал вам добавить 3 поля в модель Author, а затем прикрепить сигнал post_save к *Модель 1004 *: каждый раз, когда создается книга, вы просто рассчитываете эти значения и сохраняете их в модели Author.

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

...