Sto creando un database di registrazione degli alimenti in Django e ho un problema relativo alle query.Come ordinare per Conteggio annotato() in un modello correlato in Django
Ho impostato i miei modelli per includere (tra le altre cose) un modello alimentare collegato al modello Utente tramite un campo "consumatore" del campo M2M tramite il modello Consumo. Il modello alimentare descrive i piatti di cibo e il modello di consumo descrive il consumo di cibo di un utente (data, quantità, ecc.).
class Food(models.Model):
food_name = models.CharField(max_length=30)
consumer = models.ManyToManyField("User", through=Consumption)
class Consumption(models.Model):
food = models.ForeignKey("Food")
user = models.ForeignKey("User")
Voglio creare una query che restituisce tutti gli oggetti cibo ordinato dal numero di volte in cui oggetto cibo compare nella Tavola dei consumi per l'utente (il numero di volte in cui l'utente ha consumato il cibo).
sto cercando qualcosa nella linea di:
Food.objects.all().annotate(consumption_times = Count(consumer)).order_by('consumption_times')`
Ma questo sarà ovviamente contare tutti gli oggetti di consumo relativi all'oggetto alimentari, non solo quelli associati con l'utente. Devo cambiare i miei modelli o mi manca qualcosa di ovvio nelle domande?
Questa è un'operazione time-critical abbastanza (tra le altre cose, è utilizzato per riempire un campo di completamento automatico nel frontend) e la tabella alimentare ha un paio di migliaia di voci, quindi preferisco fare l'ordinamento nel database fine, piuttosto che fare il metodo della forza bruta e iterare i risultati facendo:
Consumption.objects.filter(food=food, user=user).count()
e quindi utilizzando python sorta di ordinarli. Non credo che il metodo si ridurrebbe molto bene con l'aumentare della base di utenti e voglio progettare il database come prova futura che posso sin dall'inizio.
Qualche idea?
Possibile duplicato di [Ordine dal conte di un campo ForeignKey?] (Http://stackoverflow.com/questions/2501149/order-by-count-of-a-foreignkey-field) –