I've reworked my approach to ORDER BY to base it on Josh's patch, and it 
works very well. It's very straightforward to implement something like this:

Article.objects.order_by(LowerCase('title'))  --> ORDER BY 
LOWER("some_articles"."title")

This makes use of all the existing expression compiling logic, so there is 
no extra "ORDER BY" logic to worry about.

What I'm not sure about is how to handle sort order. We can either support:

Article.objects.order_by(LowerCase('-title'))

which will require some special cases in the ORDER BY compilation logic 
(possibly quite substantial), or we can support:

Article.objects.order_by(Desc(LowerCase('title'))

The latter is a lot easier to implement, and strikes me as a nicer API. 
However, it's a significant step away from the ordering API we have at the 
moment. What do people think?

Tim

On Sunday, 1 June 2014 10:01:09 UTC+1, Tim Martin wrote:
>
> Funnily enough, I'd already seen that patch but I hadn't figured out the 
> full significance of it. I attempted to solve #22288 (
> https://code.djangoproject.com/ticket/22288), but spotted that your patch 
> would possibly solve the problem entirely, and at the very least breaks my 
> attempt to solve that specific case.
>
> The expression concept seems like a good direction to be going in. I'd 
> definitely be interested in seeing how to extend this to solve the two 
> tickets I'm working on. I'll take a look at your code and see what I can do 
> with it, and ask if I get stuck.
>
> Tim
>
> On Sunday, 1 June 2014 09:46:02 UTC+1, Josh Smeaton wrote:
>>
>> I would like to point you towards a patch I'm currently working on which 
>> is essentially your option 2: https://github.com/django/django/pull/2496
>>
>> It doesn't seem very relevant at first, since it only applies to 
>> .annotate and .aggregate, but the infrastructure behind it certainly does. 
>> In short, the patch expands on the concept of "Expressions". Expressions 
>> are nodes in a tree that output SQL. Functions can be expressions, a field 
>> (F() object) can be an expression, or the number 5 can be an expression. 
>> Funnily enough, I implemented the SQL `Lower` function as a test: 
>> https://github.com/jarshwah/django/commit/362fec1330f1f40c45ece5769f9e35047c87a010#diff-4c9f3e475cf7fa25e6d21c2fb7b8c30fR185
>>
>> What I'd like to do if this patch is accepted (and I believe it will be 
>> for 1.8; it's a matter of getting the backwards-compat right), is to expand 
>> the concept of expressions into the other pieces of the API, especially 
>> `order_by`. Once order_by understands expressions, it's trivial to order 
>> the result set by any kind of sql you could imagine..
>>
>> - .order_by(NullsLast('field'))
>> - .order_by(Lower('field'))
>> - .order_by(Coalesce(F('field'), F('otherfield')))
>> etc.
>>
>> Marc is right that custom transforms could be used if order_by was taught 
>> the API. I would prefer to teach order_by about Expressions though, since 
>> F() supports custom lookups and transforms already. His version would then 
>> look like: .order_by(F('title__lower')). I can see the value in a 
>> keyword__based API that is similar to the rest of django (like .filter()), 
>> but I find the syntax limiting when trying to compose multiple expressions 
>> together.
>>
>> If you were interested in branching off and working on bringing the same 
>> functionality to order_by, I'd be happy to provide information or support 
>> if you had any questions.
>>
>> Regards,
>>
>> Josh
>>
>>

-- 
You received this message because you are subscribed to the Google Groups 
"Django developers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-developers+unsubscr...@googlegroups.com.
To post to this group, send email to django-developers@googlegroups.com.
Visit this group at http://groups.google.com/group/django-developers.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-developers/a70e1fcb-665e-4421-9402-1621af559b11%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to