In my opinion, Accounts.objects.filter(balance__lt=-F('overdraft_limit'))
would not change the ordering like that. I guess that's an API that doesn't
work at the moment anyway.An alternative is to use ~ instead of - meaning inverse instead of negative. This might be more appropriate (but then is ~LowerCase not UpperCase?). Marc On 8 June 2014 17:07, Tim Martin <[email protected]> wrote: > > On Sunday, 8 June 2014 13:24:01 UTC+1, Josh Smeaton wrote: >> >> I've thought about this previously, and what I had in mind was: >> >> - Expressions should support an ordering parameter of some kind in the >> constructor, and save it to an ordering property. Default to ASC >> - If we go with Marc's suggestion, the __neg__ can set the above >> property. This would look very consistent with the existing ordering api. >> - F() objects should parse their field argument, and internally set their >> ordering attribute appropriately -> F('-title') should strip the `-` and >> set a DESC ordering. >> - Since expressions can be nested, you can't return ASC/DESC from the >> as_sql() method, otherwise you'd end up with weirdness like: Coalesce(field_a >> ASC, field_b ASC) instead of Coalesce(field_a, field_b) ASC. Therefore, >> the order_by machinery should call a `get_ordering()` (or something named >> similarly) and generate the ASC/DESC token accordingly. >> > > That sounds like a workable approach. If I'm understanding right, this > means putting the ordering flag on the ExpressionNode class so that all > nodes will have this whether or not they are to be used in an ordering > context? > > My only reservation about this when combined with __neg__ is that it means > that certain mathematical expressions will behave oddly. For example, you > might want to do something like > > Accounts.objects.filter(balance__lt=-F('overdraft_limit')) > > but this will end up flipping the ordering rather than doing a > mathematical negative. Is this dealt with by putting logic into the > SQLEvaluator so that it knows whether it's evaluating in an ordering > context or a SELECT or WHERE clause context and does the right thing? > > >> Usage: >> >> Article.objects.order_by(LowerCase('title', ordering='-')) >> >> Article.objects.order_by(-LowerCase('title')) # I prefer this form >> >> Article.objects.order_by('-title') and Article.objects.order_by(F('- >> title')) # should be equivalent (a string argument should be converted >> to an F()) >> >> >> I'm unsure whether or not expressions should inspect their "children" for >> an ordering if one isn't supplied in the outer-level: >> >> Article.objects.order_by(LowerCase('-title')) >> >> >> Should the Lowercase try to resolve the ordering of `title` and use it as >> it's own? I don't think so, because it could lead to weird conflicts where >> multiple arguments define different ordering: >> >> Article.objects.order_by(Coalesce('-title', '+description')) # is ASC >> or DESC used? Possibly confusing >> >> >> Thoughts? >> > > > I think supporting this gives lots of potential problems without much in > the way of gain. Even the "correct" form Coalesce('-title', > '-description') just looks odd to me. The DESC modifier applies to the > expression as a whole, not to any one field within it. > > Tim > > -- > 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 [email protected]. > To post to this group, send email to [email protected]. > 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/1560019a-47b6-4c90-85d6-8e8832a98510%40googlegroups.com > <https://groups.google.com/d/msgid/django-developers/1560019a-47b6-4c90-85d6-8e8832a98510%40googlegroups.com?utm_medium=email&utm_source=footer> > . > > For more options, visit https://groups.google.com/d/optout. > -- 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 [email protected]. To post to this group, send email to [email protected]. 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/CAMwjO1Hc5yd8mxn%2BEVF3MjjKTFrJEFkXLtRQqQjiOYSorGwrQg%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.
