Django: отношение внешних ключей к таблице пользователей не проверяется
Рассмотрим следующую модель django
from django.db import models
from django.contrib import auth
class Topic(models.Model):
user = models.ForeignKey('auth.models.User')
name = models.CharField(max_length = NameMaxLength , unique = True)
version_number = models.IntegerField(default = 0)
created_at = models.DateTimeField(auto_now_add = True)
modified_at = models.DateTimeField(auto_now = True)
update_frequency = models.IntegerField()
Эта модель не проверяется даже после установки таблицы auth_user
.
In [3]: auth.models.User.objects.all()
Out[3]: [<User: admin>]
Вышеприведенное утверждение относится к оболочке django-admin
$ python manage.py syncdb
Error: One or more models did not validate:
topic: 'user' has a relation with model auth.models.User, which has either not
been installed or is abstract.
Я использую django v1.0.4 с pinax 0.7.2 на ubuntu 11.04, с базой данных sqlite3
Следующие вопросы не помогли:
Ответы
Ответ 1
from django.db import models
from django.contrib.auth.models import User
class Topic(models.Model):
user = models.ForeignKey(User)
'auth.User'
тоже сработало бы. Это не синтаксис библиотеки Python, это синтаксис Django ORM "app.model". Но вы должны передать модель только как строку, если вы отчаянно пытаетесь решить круговую зависимость. И если у вас есть циклическая зависимость, ваш код будет эффективным.
Ответ 2
Даже я столкнулся с такой же проблемой,
Сообщение об ошибке ясно: вы не установили модель пользователя.
Add "django.contrib.auth" to INSTALLED_APPS in your settings.py.
Это все.. Надеюсь, что это решит эту проблему, отлично сработало для меня.
Ответ 3
У меня была такая же ошибка, но в другой ситуации.
Я разделил models.py в двух файлах:
myapp/
models/
__init__.py
foo.py
bar.py
В foo.py у меня было две модели:
class Foo(models.Model):
attr1 = ... etc
class FooBar(models.Model):
other = ... etc
foo = models.ForeignKey(Foo)
class Meta():
app_label = 'foo'
Я решил добавить Meta также в модель Foo:
class Foo(models.Model):
attr1 = ... etc
class Meta():
app_label = 'foo'