Opened 10 years ago
Last modified 8 months ago
#22977 new Cleanup/optimization
No validation error when ForeignKey related_name clashes with manager name.
Reported by: | Russell Keith-Magee | Owned by: | |
---|---|---|---|
Component: | Core (System checks) | Version: | dev |
Severity: | Normal | Keywords: | |
Cc: | Triage Stage: | Accepted | |
Has patch: | yes | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | yes |
Easy pickings: | no | UI/UX: | no |
Description
Consider the following model definition:
class Author(models.Model): authors = models.Manager() name = models.CharField(max_length=100) mentor = models.ForeignKey('self', related_name='authors')
The related name on the the foreign key clashes with the manager, so when you try to issue a query:
Author.authors.filter(name__startswith='Douglas')
you get an error because "Author.authors has no attribute 'filter'".
The problem is order dependent; if you define the manager *after* the foreign key, you get different errors.
I haven't checked what errors you get if you just have the default Manager, and a related_name of 'objects'.
There may also be problems if you have a field named 'objects'.
I suspect this class of problem could be picked up by the system check framework.
Change History (7)
comment:1 by , 10 years ago
Owner: | changed from | to
---|---|
Status: | new → assigned |
comment:2 by , 10 years ago
Has patch: | set |
---|
comment:3 by , 10 years ago
Patch needs improvement: | set |
---|
comment:4 by , 10 years ago
Owner: | removed |
---|---|
Status: | assigned → new |
comment:5 by , 10 years ago
Owner: | set to |
---|---|
Status: | new → assigned |
Version: | 1.6 → master |
comment:6 by , 10 years ago
Given loic's comment at https://github.com/django/django/pull/3359#issuecomment-59642918, what would be the correct implementation of this validation check? Adding it to BaseManager.check method?
comment:7 by , 3 years ago
Owner: | removed |
---|---|
Status: | assigned → new |
As Loic noted on the PR, we should revisit this after the
_meta
factor is merged.