Very nice work Akaariai.

I'll check this out over the next couple of days :)

Cal

On Mon, Jul 4, 2011 at 10:10 PM, akaariai <akaar...@cc.hut.fi> wrote:
> I have implemented proof of concept versions of conditional
> aggregation, F-lookups in aggregates and annotating fields to a model
> (qs.field_annotate(age_x2=F('age')*2), note: no aggregation here). See
> ticket #11305 for more details.
>
> I would also hope to implement a patch which would allow to annotate
> reverse related models. The idea would be most useful for fetching
> translation models.
>
> Given models:
> Article(
>    id=IntegerField()
>    default_lang=CharField()
> )
> ArticleTranslation(
>    article=ForeignKey(Article, related_name='translations')
>    name=TextField()
>    abstract=TextField()
>    content=TextField()
>    lang=CharField()
>    class Meta:
>        unique_together = ('article', 'lang')
> )
>
> And queryset:
> Aricle.objects.annotate(
>    translation_def=ModelAnnotation(
>        'translations',
>        only=Q(translations__lang=F('default_lang'))
>    ),
>    translation_fi=ModelAnnotation(
>        'translations',
>        only=Q(translations__lang='fi')
>    )
> )
>
> The above query would generate something like this:
> select article.id, article.default_lang, t1.name, ..., t3.name
>  from article
>    left join article_translation t1 on article.id = t1.article_id and
> t1.lang = 'fi'
>    left join article_translation t3 on article.id = t3.article_id and
> t3.lang = article.default_lang
>
> And the objects returned would have (possibly None-valued)
> translation_fi and translation_def instances attached to them.
>
> These features require a lot of work before anything commit-quality is
> ready. I would ask if the community would consider these ideas before
> I do too much work. These patches would also require some attention
> from somebody with more ORM knowledge than I have. The ModelAnnotation
> idea is probably too hard for me to implement in even near commit-
> quality.
>
> These features would naturally make the ORM more powerful, but I see
> some objections to these features:
>  1. They will make the already complex ORM even more complex. This
> will result in new bugs and it will be harder to add new features to
> the ORM.
>  2. Django ORM has the philosophy of "80/20". Meaning that the ORM
> should make it possible to run 80% of your queries, the rest can be
> done using raw SQL. Are these features beyond the 80% threshold?
>  3. As the queries become more complex, it is likely that the ORM will
> not be able to generate efficient SQL. If this is the case raw SQL is
> needed. Back to square 1.
>  4. The ORM is nearing the point where the API is too complex. Instead
> of writing complicated SQL, you will be writing complicate ORM
> queries.
>
> On the other hand, combined with custom F() expressions, the need
> for .extra() would be smaller and maybe it could even be deprecated in
> the future.
>
>  - Anssi
>
> --
> You received this message because you are subscribed to the Google Groups 
> "Django developers" group.
> To post to this group, send email to django-developers@googlegroups.com.
> To unsubscribe from this group, send email to 
> django-developers+unsubscr...@googlegroups.com.
> For more options, visit this group at 
> http://groups.google.com/group/django-developers?hl=en.
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Django developers" group.
To post to this group, send email to django-developers@googlegroups.com.
To unsubscribe from this group, send email to 
django-developers+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-developers?hl=en.

Reply via email to