#28856: GenericForeignKey attributes create new instances on every access
-------------------------------------+-------------------------------------
     Reporter:  Morgan Wahl          |                    Owner:  nobody
         Type:  Bug                  |                   Status:  new
    Component:                       |                  Version:  1.10
  contrib.contenttypes               |
     Severity:  Normal               |               Resolution:
     Keywords:                       |             Triage Stage:
                                     |  Unreviewed
    Has patch:  0                    |      Needs documentation:  0
  Needs tests:  0                    |  Patch needs improvement:  0
Easy pickings:  0                    |                    UI/UX:  0
-------------------------------------+-------------------------------------

Comment (by Simon Charette):

 I'm pretty sure this is the expected behavior from `refresh_from_db()`,
 refreshing any relationship should create a new instance as
 `ref.refresh_from_db()` should roughly translate to `ref =
 Ref.objects.get(pk=ref.pk)` while preserving `ref` identity.

 e.g. foreign key relationships have always worked this way

 {{{#!python
 >> obj_type = ref.obj_type
 >> ref.refresh_from_db()
 >> ref.obj_type is obj_type
 False
 }}}

 b9f8635f58ad743995cad2081b3dc395e55761e5 just made this consistent for
 generic foreign key which wouldn't be refreshed before it landed. This was
 a problem because if either `ref.obj_type` or `ref.obj_id` had changed
 when `refresh_from_db()` was called  then `ref.obj` would point to a
 different object that the one referenced by `ref.obj_type` and
 `ref.obj_id`.

 Django's ORM doesn't maintain an identity mapping of object, as opposed to
 SQL Alchemy for example, so you shouldn't expect refreshed instances to
 share their identity.

-- 
Ticket URL: <https://code.djangoproject.com/ticket/28856#comment:3>
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/068.9c709b6f96d0738c3adca14ad6b058b9%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to