我在各种项目中使用AbstractBaseUser作为我的用户模型。更新到Django 1.8 RC1工作顺利,我可以运行migrate management命令。然而,当尝试从头开始创建新的数据库表布局时,我得到了以下错误:
python manage.py migrate
>>> ...
>>> ...
>>> django.db.utils.ProgrammingError: relation "auth_group" does not exist
Django 1.7.x的所有功能都很好,我在其他地方找不到任何关于这个问题的信息。那么,这是RC1版本的一个大问题,还是在Django 1.8中做了一些我不知道的改变?不幸的是,错误消息并没有真正帮助。。。但我确信这与Django新版本附带的自动迁移有关。
要复制我从上面提到的Django票证中得到的答案:在调用"python manage.py migrate"创建数据库布局之前,需要为包含自定义用户类的应用程序创建一个迁移:
python manage.py makemigrations appname
这在应用程序目录中创建了一个迁移文件——瞧,migrate确实有效,并创建了其他表。
我使用的是:
./manage.py makemigrations
然后
./manage.py migrate auth
然后
./manage.py migrate
我遇到了一个非常类似的问题,抱怨使用Django 1.10的relation "auth_group" does not exist
。
python manage.py makemigrations appname
对我也没有帮助。
即使python manage.py showmigrations
也不起作用,它们都引发了相同的错误。
在详细检查了回溯之后,我发现,在我的一个基于类的视图中,我以以下方式定义了queryset
类变量:
Class SomeClassBasedView(ListView):
queryset = User.objects.filter(groups=Group.objects.get(name='Tester'))
在将其更改为覆盖get_queryset
函数intead之后,它工作正常。
Class SomeClassBasedView(ListView):
def get_queryset(self):
return User.objects.filter(groups=Group.objects.get(name='Tester'))
我在Django 1.8中遇到了几乎相同的问题,仅通过为具有自定义用户模型的应用程序运行manage.py makemigrations app_name
(+阅读下文)就解决了这个问题
例如:
# some_app/models.py:
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
pass
对于包含ForeignKey
、OneToOneField
等引用的每个应用程序,例如:
# another_app/models.py:
from django.conf import settings
from django.db import models
class Profile(models.Model):
user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
则manage.py migrate
工作时没有出现错误
同样的方法适用于任何包含django.contrib模型扩展的应用程序,例如FlatPages等。