我正在尝试以最基本的方式使用自定义用户模型,按Extending Django’s default User所述扩展AbstractUser
。但是,我不确定如何正确地与南方合作。我在进行初始模式迁移时遇到了问题,发生了以下情况:
我的班级Player
中有我的扩展用户班tournaments
,已在settings.INSTALLED_APPS
中启用。
要执行初始syncdb
,必须启用tournaments
应用。否则我收到此错误:
$ ./manage.py syncdb
CommandError: One or more models did not validate:
auth.user: Model has been swapped out for 'tournaments.Player' which has not been installed or is abstract.
admin.logentry: 'user' has a relation with model tournaments.Player, which has either not been installed or is abstract.
因此,我启用了具有tournaments
(自定义用户)模型的Player
应用。但是,在初始迁移时:
$ ./manage.py schemamigration tournaments --initial
...
$ ./manage.py migrate tournaments
Running migrations for tournaments:
- Migrating forwards to 0001_initial.
> tournaments:0001_initial
FATAL ERROR - The following SQL query failed: CREATE TABLE "tournaments_player" ("id" serial NOT NULL PRIMARY KEY, "password" varchar(128) NOT NULL, "last_login" timestamp with time zone NOT NULL, "is_superuser" boolean NOT NULL, "username" varchar(30) NOT NULL UNIQUE, "first_name" varchar(30) NOT NULL, "last_name" varchar(30) NOT NULL, "email" varchar(75) NOT NULL, "is_staff" boolean NOT NULL, "is_active" boolean NOT NULL, "date_joined" timestamp with time zone NOT NULL, "bio" text NOT NULL);
The error was: relation "tournaments_player" already exists
Error in migration: tournaments:0001_initial
DatabaseError: relation "tournaments_player" already exists
如果我跳过syncdb
,我会收到此错误,因为引导南方需要syncdb
:
$ ./manage.py migrate tournaments
DatabaseError: relation "south_migrationhistory" does not exist
LINE 1: ...gration", "south_migrationhistory"."applied" FROM "south_mig...
所以,看来我这里有鸡/蛋的情况:没有我的用户模型,我不能syncdb
。但是,如果我syncdb
使用我的用户模型,我就无法执行初始迁移!
解决这个问题的最佳方法是什么?我有一些想法,例如在未启用syncdb
和django.contrib.auth
的情况下运行初始django.contrib.admin
,或启用未启用syncdb
的初始south
,然后转换应用程序。这两个选项看起来都很奇怪。
答案 0 :(得分:9)
尝试运行./manage.py migrate tournaments --fake 0001
。这将在南迁移历史记录中添加一个条目,表示初始迁移已运行,而不实际执行SQL。或者,您可以在自定义用户对象上设置class Meta: managed = False
,以告知django不要同步该模型。
答案 1 :(得分:2)
这有效:
django.contrib.auth
,django.contrib.admin
和tournament
(我的自定义用户模型应用在settings.INSTALLED_APPS
。manage.py syncdb
django.contrib.auth
,django.contrib.admin
和tournament
manage.py schemamigration tournaments --initial
manage.py syncdb
manage.py migrate tournaments
相当hackey和可怕。很想知道更好的方式。
答案 2 :(得分:0)
我遇到了完全相同的问题,但即使我的应用程序位于CommandError:
并卸载南方,我也会得到INSTALLED_APPS
。我确实在南方找到了一张机票,#1179,here。一张匿名海报与托马斯有类似的工作,但有点复杂。他们确实说这是南方而不是Django的问题,但我不知道我是如何卸载南方的,将其从我的INSTALLED_APPS
中删除,我仍然有完全相同的错误。
@dimadima看起来托马斯的答案帮助了你,但是你能告诉我哪种方式适合你,也许可以通过点击复选标记来接受他的回答吗?