Opened 11 years ago
Closed 11 years ago
#21411 closed Bug (worksforme)
CommandError: One or more models did not validate but backtrace not saying anything useful
Reported by: | artscoop | Owned by: | nobody |
---|---|---|---|
Component: | Documentation | Version: | 1.6 |
Severity: | Normal | Keywords: | validate |
Cc: | Baptiste Mispelon | Triage Stage: | Accepted |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
Hi,
There is a typo in my code (30 000 lines), which I cannot find. I cannot runserver
, validate
or shell_plus
(django_extensions). I've had this problem with many versions of Django, but somehow managed to find where the error was. This time, I can't, and all I get is this cryptic error, absolutely not related to the position of the error, even with the --traceback
and verbosity
options.
Traceback (most recent call last): File "/home/username/virtualenv/project/one/manage.py", line 8, in <module> execute_from_command_line(sys.argv) File "/home/username/virtualenv/project/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 399, in execute_from_command_line utility.execute() File "/home/username/virtualenv/project/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 392, in execute self.fetch_command(subcommand).run_from_argv(self.argv) File "/home/username/virtualenv/project/local/lib/python2.7/site-packages/django/core/management/base.py", line 242, in run_from_argv self.execute(*args, **options.__dict__) File "/home/username/virtualenv/project/local/lib/python2.7/site-packages/django/core/management/base.py", line 285, in execute output = self.handle(*args, **options) File "/home/username/virtualenv/project/local/lib/python2.7/site-packages/django/core/management/base.py", line 415, in handle return self.handle_noargs(**options) File "/home/username/virtualenv/project/local/lib/python2.7/site-packages/django/core/management/commands/validate.py", line 10, in handle_noargs self.validate(display_num_errors=True) File "/home/username/virtualenv/project/local/lib/python2.7/site-packages/django/core/management/base.py", line 314, in validate raise CommandError("One or more models did not validate:\n%s" % error_text) django.core.management.base.CommandError: One or more models did not validate: menu.bookmark: 'user' has a relation with model user.User, which has either not been installed or is abstract. reversion.revision: 'user' has a relation with model user.User, which has either not been installed or is abstract. auth.user: Model has been swapped out for 'user.User' which has not been installed or is abstract. moderation.moderatedobject: 'moderated_by' has a relation with model user.User, which has either not been installed or is abstract. moderation.moderatedobject: 'changed_by' has a relation with model user.User, which has either not been installed or is abstract. admin.logentry: 'user' has a relation with model user.User, which has either not been installed or is abstract. dashboard.dashboardpreferences: 'user' has a relation with model user.User, which has either not been installed or is abstract.
In the shell
command, I can import the User
model and several others, so I know there is no typo in this model.
Change History (8)
comment:1 by , 11 years ago
Resolution: | → invalid |
---|---|
Status: | new → closed |
comment:2 by , 11 years ago
Well, the user
app is obviously in INSTALLED_APPS
. This exact error occurred to me before, just because of an import error in a file in another app (which is something completely unrelated). Everything worked yesterday but some edit somewhere broke everything, I cannot find where, the compiler in Eclipse shows no import error in any file.
I am absolutely positive that the error message provided by Django is totally useless here : The validation only reports errors in models fields and so on. In our situation, user.User
cannot be imported because of another error, which is not raised.
comment:3 by , 11 years ago
Resolution: | invalid |
---|---|
Status: | closed → new |
Sorry, but this really is a bug in Django (found a similar ticket where the bug was introduced in 1.1)
Please see my comment above.
comment:4 by , 11 years ago
Found. I don't know how it worked before now and how it suddenly stopped working, but I found the culprit. One third-party app models
file defined User = get_user_model()
, and used this as a ForeignKey
target, instead of using a label. I suppose that at this time, the user model was not in the AppCache, which raised the error. What is bugging me is that this exact code had been working flawlessly for months.
I really think the Django documentation should warn against using classes directly as ForeignKey
targets, and recommend using the app.model
string representation, especially when linking to the user model. This behaviour prevents all circular and "too early" imports.
Even better, Django itself should, at some time, deprecate using classes as ForeignKey
targets.
comment:5 by , 11 years ago
Cc: | added |
---|---|
Type: | Uncategorized → Bug |
Hi,
Thanks for reopening the ticket.
It seems that your configuration is triggering a bug in the app-loading mechanism of django.
Could you provide some steps on how to reproduce this issue (as it is now, I'm not able to reproduce the behavior you describe)?
Alternatively, since you say that things were working at some point, are you able to pinpoint the failure to a particular Django commit?
follow-up: 8 comment:6 by , 11 years ago
Component: | Core (Management commands) → Documentation |
---|---|
Triage Stage: | Unreviewed → Accepted |
We've seen similar issues and reached the conclusion that the proper way to link to the user model is:
user = models.ForeignKey(settings.AUTH_USER_MODEL)
We should document this.
comment:7 by , 11 years ago
I forgot about this ticket.
@bmispelon, to reproduce this bug (which is simple actually), just add the django-activity-stream app (available on PyPI). If the package has not been fixed for this error, you should get the same error I've had.
@aaugustin, totally agree with it, when I refactored a project for Django 1.5, I had to use this to make the project work again.
comment:8 by , 11 years ago
Resolution: | → worksforme |
---|---|
Status: | new → closed |
Replying to aaugustin:
We've seen similar issues and reached the conclusion that the proper way to link to the user model is:
user = models.ForeignKey(settings.AUTH_USER_MODEL)We should document this.
It is documented already: https://docs.djangoproject.com/en/1.5/topics/auth/customizing/#django.contrib.auth.get_user_model
Hi,
I'm not sure how the error message can be improved. Do you have suggestions?
Your problem seems to be that you have
AUTH_USER_MODEL = 'user.User'
in your settings but theuser
app is not in yourINSTALLED_APPS
.I've been able to gather this from the error messages so they can't be as useless as you make them to be.
There's always room for improvement though so if you have ideas on how to make these particular error messages more helpful, please share.
In the meantime, I'll close this ticket as
invalid
.Please reopen it if you have a concrete proposal or if you want to point out what you think is not clear in the error messages.
If you're still stuck, you can reach out to our support channels [1] for help.
Thanks.
[1] https://docs.djangoproject.com/en/1.6/faq/help/#how-do-i-do-x-why-doesn-t-y-work-where-can-i-go-to-get-help