On Tue, Aug 4, 2015 at 8:06 AM, Tai Lee <real.hu...@mrmachine.net> wrote: > I think that while `extra()` gets a bad rap, it is extremely useful when > creating generic pluggable apps, and I for one would miss it if it were to > be removed.
The idea is that expressions should do everything that extra() can do. There might be cases where this is not yet true, but I hope we will get there in a couple of releases. The extra() method should not be better than expressions for reusable apps. Actually the contrary, with expressions you can generate different SQL for different databases. > In a comment on #7231 a few years ago I wrote: > >> I can't reply to the discussion linked on Google Groups anymore, but >> wanted to add my comment that I have found many uses for .extra() and also >> hit the limitation of being unable to add left outer joins to a query >> generated by the ORM. I would not like to see it disappear in favour of raw >> SQL. >> >> >> My current use case is for joining reverse generic relations on queries >> against a model that does not have a GenericRelation field back to the >> generic model (because I don't know which models it will be used with -- I >> can't add models to 3rd party code). >> >> >> To require the whole query in raw SQL in order to join generic relations >> would mitigate the pluggability of the generic model in question. > > > While `raw()` may be allow you to get model instances from any custom SQL, > it will often be prohibitively complicated or impossible to provide generic > queryset methods that extend 3rd party apps. The RawSQL expression example > given would appear to execute a subquery for each row of the result set. It > wouldn't seem to help with the example above, unless I'm missing something? What we want is something like qs.add_relation(new_rel=Relation(SomeModel, on_clause=some_expression, allow_nulls=True)) The some_expression variable generates sql for the ON clause, and allow_nulls=True means the join will be LEFT join. Typically some_expression could be something like Q(id=F('new_rel__other_id')) & Q(new_rel__lang='fi'). The effect of this would be that the qs has a new relation called new_rel to SomeModel, and that relation could be used in other query constructs (for example .filter(new_rel__somef__lte=10)). Making this work is high priority to me. - Anssi -- You received this message because you are subscribed to the Google Groups "Django developers (Contributions to Django itself)" 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/CALMtK1GQ1oAgeSCgNvNu%3D1ucKEuduDOttpwCUCxSd-Ct8auzcg%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.