On 18 Feb, 19:08, Jacob Kaplan-Moss <jacob.kaplanm...@gmail.com>
wrote:
> On Wed, Feb 18, 2009 at 11:12 AM, Deniz Dogan <deniz.a.m.do...@gmail.com> 
> wrote:
> > Let's say I have a model called Bike with a DateField called
> > "production_date". Now I want to get all of the Bikes and group them
> > by their production date. How would I do this in Django? I can't seem
> > to figure it out.
>
> For this type of query, you need to ask yourself two things:
>
> The first question is easy: What kind of aggregate do I want? You want
> a count, so you'd use the ``Count()`` aggregate (i.e.
> ``django.db.models.Count``). That's simple; I'll bet you already
> figured that part out.
>
> The second part is more tricky: what is the set of fields I'm grouping
> over? By default, it's all the fields on the model, so a simple
> ``aggregate(Count(production_date))`` basically is the same as a
> ``COUNT(*)``, which you don't want::
>
>     >>> Bike.objects.aggregate(Count('production_date'))
>     {'production_date__count': 7}
>
> So you need to change the list of fields you're grouping over. You do
> this by using ``values()``; the important part of the docs to read 
> ishttp://docs.djangoproject.com/en/dev/topics/db/aggregation/#values;
> make sure to pay attention to the part about the order of
> ``annotate()`` and ``values()``.
>
> If you read that carefully, you'll see that to change the set of
> grouped fields you'll want to call ``values()`` before calling
> ``annotate()``::
>
>     >>> qs = Bike.objects.values('production_date') \
>     ...                  .annotate(count=Count('production_date')) \
>     >>> for r in qs:
>     ...    print "%(production_date)s: %(count)s bikes" % r
>     2008-01-01 2 bikes
>     2008-01-02 1 bikes
>     2008-01-03 1 bikes
>     2008-01-04 2 bikes
>     2008-01-05 1 bikes
>
> Hope that helps!
>
> Jacob

Thanks for your response, Jacob!

However, one of us has misunderstood something here, and I'm not sure
whether that's you or me. With your method I get the amount of bikes
that were made on each day, but what I want is to have is a structure
similar to this one:

{ 'production_date' : 2008-01-02,
  'bikes' : [Bike 1, Bike 2],
  'production_date' : 2008-02-09,
  'bikes : [Bike 7, Bike 4]
}

I.e. I want to be able to access the actual Bike objects, not how many
that were made on each day.

Thanks again,
Deniz
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To post to this group, send email to django-users@googlegroups.com
To unsubscribe from this group, send email to 
django-users+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to