﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
28408	Incorrect error message with QuerySet.update() that requires a join on an annotated F expression	Kevin Marsh	Can Sarıgöl	"I ran into a bit of a nasty error yesterday on Django 1.11, Postgres 9.5 where I was trying to do an update using an `F` expression where the value in that expression referred to an annotation of an annotation, each using a `Case` statement inside the annotation. The error message it was giving me was something like the following:


{{{
ProgrammingError                          Traceback (most recent call last)
<ipython-input-1-29e48364245c> in <module>()
----> 1 MyModel.objects.causing_problems()

/usr/src/app/apps/myapp/managers.py in causing_problems(self)
    833                 ).update(        
--> 834                         my_field=F('my_annotated_field'),
    835                 )
    836 

/usr/src/app/apps/django/db/models/query.py in update(self, **kwargs)
    645         query._annotations = None
    646         with transaction.atomic(using=self.db, savepoint=False):
--> 647             rows = query.get_compiler(self.db).execute_sql(CURSOR)
    648         self._result_cache = None
    649         return rows

/usr/src/app/apps/django/db/models/sql/compiler.py in execute_sql(self, result_type)
   1189         related queries are not available.
   1190         """"""
-> 1191         cursor = super(SQLUpdateCompiler, self).execute_sql(result_type)
   1192         try:
   1193             rows = cursor.rowcount if cursor else 0

/usr/src/app/apps/django/db/models/sql/compiler.py in execute_sql(self, result_type, chunked_fetch)
    884                 # silencing when dropping Python 2 compatibility.
    885                 pass
--> 886             raise original_exception
    887 
    888         if result_type == CURSOR:

ProgrammingError: missing FROM-clause entry for table ""myapp_mymodel""
LINE 1: ...false END, ""a_field"" = CASE WHEN CASE WHEN (""myapp_my...
}}}

Spent a while trying to debug where it was going wrong, ended up narrowing down the problem to trying to update a field using an `F` expression on an annotated field which included a join in it. I'm not sure if better error message would have helped in my case but in the much simpler test attached it'd be useful if the first and second assertions raised the same or similar error message."	Bug	closed	Database layer (models, ORM)	dev	Normal	fixed	annotate, F, update	Can Sarıgöl	Accepted	1	0	0	0	0	0
