#33680 closed Bug (fixed)
Documentation example of customising model instance loading has a bug
Reported by: | Ali Toosi | Owned by: | Ali Toosi |
---|---|---|---|
Component: | Documentation | Version: | 4.0 |
Severity: | Normal | Keywords: | documentation, from_db, model instance loading |
Cc: | Triage Stage: | Ready for checkin | |
Has patch: | yes | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | yes | UI/UX: | no |
Description (last modified by )
The docs provide an example of how the model instance loading can be changed and how _loaded_values
can be saved for future comparison here: https://docs.djangoproject.com/en/4.0/ref/models/instances/
In this example, it checks if there are any values not loaded from db then add them as DEFERRED values so class instantiation would work (cls(*values)
). However, this would mean values
list has items now that do not map to any field_names
so when at the end of the function, we zip them together and store in _loaded_values
, the code will fail.
The easiest fix for this is to update the field_names
too so they would 1. work and 2. show which fields were not loaded from the db at the time.
I've opened a PR for this here: https://github.com/django/django/pull/15664
Change History (7)
comment:1 by , 3 years ago
Description: | modified (diff) |
---|---|
Has patch: | set |
follow-up: 4 comment:2 by , 3 years ago
Owner: | changed from | to
---|---|
Patch needs improvement: | set |
Status: | new → assigned |
Thanks for the ticket.
The easiest fix for this is to update the field_names too so they would 1. work and 2. show which fields were not loaded from the db at the time.
I'd keep the previous behavior and rather filter out DEFERRED
from the list of values, e.g.
-
docs/ref/models/instances.txt
diff --git a/docs/ref/models/instances.txt b/docs/ref/models/instances.txt index 3638c6ccff..ec0232673e 100644
a b are loaded from the database:: 103 103 instance._state.adding = False 104 104 instance._state.db = db 105 105 # customization to store the original field values on the instance 106 instance._loaded_values = dict(zip(field_names, values)) 106 instance._loaded_values = dict( 107 zip(field_names, (value for value in values if value is not DEFERRED)) 108 ) 107 109 return instance 108 110 109 111 def save(self, *args, **kwargs):
comment:3 by , 3 years ago
Triage Stage: | Unreviewed → Accepted |
---|
comment:4 by , 3 years ago
Replying to Mariusz Felisiak:
Thanks, Mariusz. I've updated the PR with your suggestion.
comment:5 by , 3 years ago
Patch needs improvement: | unset |
---|---|
Triage Stage: | Accepted → Ready for checkin |