Fail loudly and clearly when an Annotation alias matches a field name.
|Reported by:||donspaulding||Owned by:|
|Component:||Database layer (models, ORM)||Version:||master|
|Cc:||Triage Stage:||Ready for checkin|
|Has patch:||yes||Needs documentation:||no|
|Needs tests:||no||Patch needs improvement:||no|
Continued from a django-users thread
Given the following two models:
class Author(models.Model): last_updated = models.DateField() class Book(models.Model): author = models.ForeignKey(Author, related_name='books') pubdate = models.DateField()
The following annotation query will produce unexpected results:
authors = Author.objects.annotate(last_updated=Max('books__pubdate'))
And it may not raise an error until you combine it with other parts of the queryset api, like order_by:
authors = Author.objects.annotate(last_updated=Max('books__pubdate')).order_by('last_updated')
While it's true that these invalid queries are the developer's fault, it's not at all obvious what's gone wrong. Unless there is some valid case for clobbering your own namespace, I suggest that instead of leaving this behavior defined by the particular DB and query, an Exception be raised to let the developer know they've made a mistake before it hits the SQL level.