#28944: Chaining values()/values_list() after QuerySet.select_for_update(of=())
crashes
-------------------------------------+-------------------------------------
     Reporter:  Thierry Bastian      |                    Owner:  nobody
         Type:  Bug                  |                   Status:  new
    Component:  Database layer       |                  Version:  2.0
  (models, ORM)                      |
     Severity:  Release blocker      |               Resolution:
     Keywords:                       |             Triage Stage:  Ready for
                                     |  checkin
    Has patch:  1                    |      Needs documentation:  0
  Needs tests:  0                    |  Patch needs improvement:  0
Easy pickings:  0                    |                    UI/UX:  0
-------------------------------------+-------------------------------------
Changes (by Thierry Bastian):

 * status:  closed => new
 * resolution:  fixed =>


Comment:

 Ok so you fixed the simple case with self, but it still fails where there
 are joins.

 So if you have 2 models:


 {{{

 class A(models.Model):
    foo = models.TextField()

 class B(models.Model):
     bla = models.TextField()
     a = models.ForeignKey(a, on_delete=models.CASCADE)

 and then if you want to do:
 B.objects.all().select_related('a').select_for_update(of=('self', 'a')) ,
 that works
 but the same with a values_list:
 B.objects.all().select_related('a').select_for_update(of=('self',
 'a')).values_list('pk', 'a__foo'), that does not work and results in
 something like (I have different class names in my code)

 Traceback (most recent call last):
   File "<console>", line 2, in <module>
   File "/usr/local/filewave/python/lib/python3.6/site-
 packages/django/db/models/query.py", line 248, in __repr__
     data = list(self[:REPR_OUTPUT_SIZE + 1])
   File "/usr/local/filewave/python/lib/python3.6/site-
 packages/django/db/models/query.py", line 272, in __iter__
     self._fetch_all()
   File "/usr/local/filewave/python/lib/python3.6/site-
 packages/django/db/models/query.py", line 1179, in _fetch_all
     self._result_cache = list(self._iterable_class(self))
   File "/usr/local/filewave/python/lib/python3.6/site-
 packages/django/db/models/query.py", line 139, in __iter__
     return compiler.results_iter(tuple_expected=True,
 chunked_fetch=self.chunked_fetch, chunk_size=self.chunk_size)
   File "/usr/local/filewave/python/lib/python3.6/site-
 packages/django/db/models/sql/compiler.py", line 1015, in results_iter
     results = self.execute_sql(MULTI, chunked_fetch=chunked_fetch,
 chunk_size=chunk_size)
   File "/usr/local/filewave/python/lib/python3.6/site-
 packages/django/db/models/sql/compiler.py", line 1051, in execute_sql
     sql, params = self.as_sql()
   File "/usr/local/filewave/python/lib/python3.6/site-
 packages/django/db/models/sql/compiler.py", line 508, in as_sql
     of=self.get_select_for_update_of_arguments(),
   File "/usr/local/filewave/python/lib/python3.6/site-
 packages/django/db/models/sql/compiler.py", line 962, in
 get_select_for_update_of_arguments
     ', '.join(_get_field_choices()),
 django.core.exceptions.FieldError: Invalid field name(s) given in
 select_for_update(of=(...)): mdm_client. Only relational fields followed
 in the query are allowed. Choices are: self.


 }}}

-- 
Ticket URL: <https://code.djangoproject.com/ticket/28944#comment:7>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-updates+unsubscr...@googlegroups.com.
To post to this group, send email to django-updates@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/067.1ed2c1efa5b271bffe364f2b75b92c6f%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to