#28188 closed Bug (fixed)
Field._get_default() prevents model fields from being pickled
Reported by: | Adam Alton | Owned by: | |
---|---|---|---|
Component: | Database layer (models, ORM) | Version: | 1.11 |
Severity: | Release blocker | Keywords: | |
Cc: | Triage Stage: | Accepted | |
Has patch: | yes | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description (last modified by )
The changes introduced in d2a26c1a90e837777dabdf3d67ceec4d2a70fb86 mean that in cases where a model field has a default and the default is not a callable, the field instance cannot be pickled.
The offending line is:
return lambda: self.default
This problem only exists in Django version >= 1.11.
The reason for that lambda is because the code has been refactored so that all the logic for getting the default value has been moved into the _get_default method, which allows it to be cached with the @cached_property decorator. And then the get_default method expects the value returned from _get_default to always be a callable. That requirement for the value to always be a callable is the reason for wrapping the value with lambda in the case where it's not already a callable.
My proposed solution is to simply move the if callable() check back out into the get_default method. This would mean that we lose a very minor bit of efficiency because we have to run that one if statement each time that get_default is called, but the rest of the logic would remain inside the cached _get_default method.
I have made a commit here which contains my proposed fix and a test to prevent regression: https://github.com/adamalton/django/commit/ee6aafacfd01f2603943e8c4183805fd4a298355
Change History (5)
comment:1 by , 7 years ago
Component: | Uncategorized → Database layer (models, ORM) |
---|---|
Severity: | Normal → Release blocker |
Summary: | Field._get_default prevents model fields from being pickled → Field._get_default() prevents model fields from being pickled |
Triage Stage: | Unreviewed → Accepted |
Type: | Uncategorized → Bug |
comment:2 by , 7 years ago
Description: | modified (diff) |
---|---|
Owner: | changed from | to
Status: | new → assigned |
comment:3 by , 7 years ago
Has patch: | set |
---|---|
Owner: | removed |
Status: | assigned → new |
PR
I've made the pull request to merge into the stable/1.11.x branch (which is what I branched from). I hope that's the right thing to do. Let me know if it's not.