Hm, I thought it was kind of self-evident. Okay, here's the sample Model definition:
class Records (models.Model): id = models.IntegerField(primary_key=True) state = models.TextField() race = models.TextField() age = models.IntegerField() sex = models.TextField() population = models.IntegerField() Imagine it has 5 records 1 WA Black 55 F 123 2 WA White 55 F 556 3 WA Asian 55 F 612 4 WI Amer. Indian 55 F 125 5 WA Unknown 55 F 23 So I know the population for a combination of demographics (from census data, fwiw, though the example above is totally fabricated). But I want to combine some groups and see what the new population distribution is. In this case, I want to create a generalized race grouping, and I want to end up with something like this Black 55 F 123 White 55 F 556 Other 55 F 760 My current approach is to add an extra field with the generalized race classification r = r.extra(select={'generalized_race: "CASE race WHEN 'Black' THEN 'B' WHEN 'White' THEN 'W' ELSE 'O' END"}) As mrts said, this does create a new field, but the field is unavailable to use in further queries. Below is what I would *like* to work....Add the new field, then use the values() function to group by all applicable fields. fields = ['age', 'sex', 'generalized_race'] r = r.values(*fields).annotate(Pop = Sum('population')) Any suggestions for alternate approaches? ~Kathy On Sep 17, 3:29 am, mrts <mrts.py...@gmail.com> wrote: > On Sep 16, 11:30 pm, Kathleen Benitez <kathleen.beni...@gmail.com> > wrote: > > > I am attempting to evaluate some generalization schemes using Django. > > In particular, I'd like to create a new field (generalized race), and > > then find a total population using the values() function as follows: > > annotate() is somewhat confusing in your example, seeing the Record > model and explicitly stating what you want to achieve with it > would help us to help you better. > > > 1 r = Records.objects > > 2 r = r.extra(select={'generalized_race: "CASE race WHEN 'Black' THEN > > 'B' WHEN 'White' THEN 'W' ELSE 'O' END"}) > > This is indeed "registered with Django": > > >>> rs = Record.objects.extra(select={'generalized_race': > > ... "CASE race WHEN 'Black' THEN'B' WHEN 'White' THEN 'W' ELSE 'O' > END"})>>> rs[0].generalized_race > > u'B' > > However, it is correct that although extra(select={'foo': ...}) > augments the results with the field foo, it is not a proper > models.Field and can not be referenced in further QuerySet methods. > > > 3 fields = ['age', 'sex', 'generalized_race'] > > 4 r = r.values(*fields).annotate(Pop = Sum('population')) > > Are you sure you need the values() call here? If you really don't > want to select other fields, only() works equally well and retains > the generalized_race pseudo-field: > > >>> fields = ['age', 'sex'] > >>> rs.only(*fields)[0].generalized_race > > u'B' > > As for the annotate() clause, it is unclear where the population comes > from and what's the intent. Please clarify. --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---