Opened 18 years ago
Closed 17 years ago
#3436 closed (wontfix)
Don't fetch Field's choices on form/manipulator creation
Reported by: | Owned by: | nobody | |
---|---|---|---|
Component: | Core (Other) | Version: | dev |
Severity: | Keywords: | performance | |
Cc: | Maniac@…, gabor@… | Triage Stage: | Accepted |
Has patch: | yes | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | yes |
Easy pickings: | no | UI/UX: | no |
Description
Currently creation of a default manipulator for a model causes actual fetching of all content of every related parent models which tends to be slow. They are used to fill <select>s created for ForeignKeys and ManyToManyFields but this may be unnecessary if those <select>s never rendered. This can be easily fixed by turning a method that gets choices for <select>s (Field.get_choices()) into a generator that will hit database only when (and if) needed.
Patch follows.
Attachments (1)
Change History (12)
by , 18 years ago
comment:1 by , 18 years ago
Has patch: | set |
---|
comment:2 by , 18 years ago
Patch needs improvement: | set |
---|---|
Triage Stage: | Unreviewed → Accepted |
Marking this as accepted, but new feature will probably not get added to Manipulators. Does newforms exhibit the same problem? If so, it would be great if someone could submit a patch for newforms.
comment:3 by , 18 years ago
Gary, this code lives in db field, not old form fields, so it works for newforms too. Actually it was created after concerns in django-developers about newforms fetching related values like old forms.
comment:4 by , 18 years ago
If we ever need it for verifying this problem, Joe Heck put a test case in #2638.
comment:5 by , 18 years ago
Component: | Database wrapper → Core framework |
---|
comment:6 by , 18 years ago
Cc: | added |
---|
comment:7 by , 18 years ago
Keywords: | performance added |
---|
comment:8 by , 18 years ago
A small comment about this change (since I've looked at it, but don't have cycles to complete the work at the moment)...
I looked at this patch a couple of weeks ago. It wasn't immediately clear where the performance improvement appeared. It's definitely an improvement for some uses, but are we hitting those uses in newforms?
So we need a test to demonstrate how this is triggered, I think. It's a slight backwards incompatible change (since the returned type of get_choices changes). It wasn't apparent when I moved Joe Heck's example from #2638 over to newforms, for example.
comment:9 by , 18 years ago
To clarify... You want a regression test showing that it works properly or a test showing a performance gain? I'm not sure how to do the latter. And the former is show by any newforms test that renders a <select>.
comment:10 by , 17 years ago
Ok, I've tested it a bit. The problem really doesn't affect newforms since Field.formfield calls get_choices only if a field has explicit 'choices' attribute set. ForeignKeys don't have choices and are fetched by formfield's widget only at display time. Oldforms still have a problem though.
comment:11 by , 17 years ago
Resolution: | → wontfix |
---|---|
Status: | new → closed |
Per comments above this is not a problem in newforms, and the old forms system is deprecated, so I'm marking this wontfix.
Patch