On Tue, Mar 24, 2009 at 12:17 AM, eli <eliasz.wont...@gmail.com> wrote: > > How to pass to the Sum() function (ORM) more than one field? > > My problem: > > class Model1(models.Model): > name = models.CharField(u'Name', max_length=255) > > class Model2(models.Model): > fk1 = models.ForeignKey(Model1, related_name='fk_1') > fk2 = models.ForeignKey(Model1, related_name='fk_2') > > I want to sort data by sum of fk1 and fk2 field. > > Model1.objects.annotate(myfk1=Count('fk1', distinct=True), myfk2=Count > ('fk2', distinct=True)).annotate(my_sum=Sum('myfk1+myfk2')).order_by('- > my_sum')
The first two parts - the annotation of myfk1 and myfk2 is fine - but at present, annotation is a purely aggregate activity - you can't (currently) annotate an expression that is formed from two fields on the same model instance. This is a feature I would like to add at some point, but it won't be happening any time soon. You could do this using an 'extra' clause; i.e., replace the final annotate() with: .extra(select={'my_sum':'myfk1+myfk2'}) The extra clause is used to insert raw SQL into a Django query, so you are responsible for choosing column names, etc However, aggregate column names are fairly predictable, so you shouldn't hit too many problems. Regardless, I strongly advise reading the documentation on the extra clause so that you are aware of the issues you may hit. Yours, Russ Magee %-) --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---