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
-~----------~----~----~----~------~----~------~--~---

Reply via email to