Agregación de Django y seguimiento de relaciones de clave externa.

Modelos:

class Item(models.Model): name = models.CharField(max_length=100) # More stuff. class Sale(models.Model): sale_date = models.DateField(auto_now_add=True) item = models.ForeignKey(Item) # More stuff. 

Ver:

 class TodaySales(ListView): # Stuff in here. def get_queryset(self): sales_today = Sale.objects.filter(sale_date=date.today()) return sales_today.values('item').annotate(Count('item')) 

Vuelvo algo como esto:

 [{'item': 1, 'item__count': 2}, {'item': 2, 'item__count': 1}] 

Esto es bueno y todo, pero lo que realmente quiero es poder obtener información adicional sobre el artículo, como su nombre, etc. Pero parece que no puedo hacer esto fácilmente ya que todo lo que obtengo es el ID del artículo, así que No puedo en mi plantilla hacer, por ejemplo, {{item.name}}.

¿Hay alguna buena manera de hacer esto?

Esto lo hara. Tratar:

 Item.objects.filter( sale__sale_date=date.today() ).annotate( count = Count('sale') ) 

A medida que se preocupa por obtener datos adicionales del Artículo, en lugar de la Venta, puede consultar en esa clase:

 models.Item.objects.filter(sale__sale_date=date.today()).annotate(Count('id')) 

Eso devuelve objetos ORM, en lugar de values o una values_list de values : también tendrá un atributo id__count sintético disponible con el recuento de ventas para ese artículo en particular.

Alternativamente, si sabe de antemano exactamente qué campos desea, también puede nombrarlos explícitamente en su invocación de values , por ejemplo:

 sales_today.values('item', 'item__name').annotate(Count('item'))