#10453 closed (fixed)
get_db_prep_value called with seralized data
| Reported by: | Brian May | Owned by: | nobody |
|---|---|---|---|
| Component: | Database layer (models, ORM) | Version: | 1.0 |
| Severity: | Keywords: | ||
| Cc: | Triage Stage: | Unreviewed | |
| Has patch: | no | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description
Hello,
In order to resolve the difficulties encountered by ticket #10028, I installed the latest code from the http://code.djangoproject.com/svn/django/branches/releases/1.0.X branch.
It appears that the behaviour of the "get_db_prep_value" function has changed, and the current behaviour seems wrong to me.
(note: actual function call is get_db_prep_save, but as this just calls get_db_prep_value I consider them the same)
From:
<http://docs.djangoproject.com/en/dev/howto/custom-model-fields/>
def get_db_prep_value(self, value):
return ''.join([''.join(l) for l in (value.north,
value.east, value.south, value.west)])
This would imply value should always be the python object returned by to_python.
It seems in my case, when calling save() on an object and this field is not updated, then value contains the raw un-serialized string data straight from the database.
I could work around this by checking if the value is a string, and if so, returning it as is, but to me this seems wrong.
Stack trace:
Traceback (most recent call last):
File "./import", line 681, in <module>
sys.exit(main())
File "./import", line 663, in main
host.process_all(force)
File "./import", line 438, in process_all
self.update_last_seen(self.datetime)
File "/home/brian/myproject/lintory/inventory/importer.py", line 160, in update_last_seen
self.computer.save()
File "/home/brian/tree/django/django/db/models/base.py", line 329, in save
self.save_base(force_insert=force_insert, force_update=force_update)
File "/home/brian/tree/django/django/db/models/base.py", line 380, in save_base
rows = manager.filter(pk=pk_val)._update(values)
File "/home/brian/tree/django/django/db/models/query.py", line 434, in _update
query.add_update_fields(values)
File "/home/brian/tree/django/django/db/models/sql/subqueries.py", line 239, in add_update_fields
val = field.get_db_prep_save(val)
File "/home/brian/tree/django/django/db/models/fields/__init__.py", line 192, in get_db_prep_save
return self.get_db_prep_value(value)
File "/home/brian/myproject/lintory/names.py", line 188, in get_db_prep_value
return value.get_value()
AttributeError: 'str' object has no attribute 'get_value'
From this stack trace, it would appear that get_db_prep_save is called twice for the same data:
- Line 379 of django/db/models/base.py
- Line 239 of db/models/sql/subqueries.py
Brian May
I'm thinking this is probably fixed by r10013 (trunk) and r10014 (1.0.X). If not, can you please reopen with a step-by-step to repeating the problem (preferably a patch against the tests that fail, but if not, at least something we can repeat).