Complexe groepering en gemiddelden in Django

Ik heb een modelstructuur zoals deze:

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)

Ik wilde de Boeken van elke auteur tellen. Dit was gemakkelijk omdat ik kon doen: Author.objects.values ​​('name'). Annotate (count = Count ('book')) .

Ik heb veel moeite met het berekenen van deze:

  • aantal unieke categorieën per auteur.
  • gemiddeld aantal boeken dat door een auteur in een categorie is geschreven
  • (Dit is moeilijk.) de gemiddelde duur tussen het eerste en het laatste boek geschreven door een auteur in een categorie.

Ik ben geen ORM-querygoeroe en als ik dit probleem moest aanpakken, zou ik waarschijnlijk veel lussen en andere iteraties gebruiken om dit te berekenen, maar ik weet dat dit niet de juiste manier is om dit te doen.

(Ik weet dat sommige dingen in dit scenario vreemd zijn, bijvoorbeeld een unieke beperking van de naam van de auteur, maar dit was het beste voorbeeld dat ik heb gevonden om mijn probleem te illustreren.)

Heb je hulp nodig over hoe ik dit kon bereiken?

Bedankt.

4

1 antwoord

Ouwe, harde.

Aangezien dit geen informatie is die u vaak moet vernieuwen, raad ik u aan om 3 velden toe te voegen aan het model Auteur en vervolgens een bericht na de opslag toe te voegen aan het model Boek : elke keer dat een boek wordt aangemaakt, berekent u die waarden gewoon en slaat u ze op in het model Auteur .

Je kunt ze dan gemakkelijk filteren, het zal erg snel zijn om te tonen en de tijd om het te berekenen zal bijna onmerkbaar zijn als het opslaan toch gebeurt.

2
toegevoegd