自定义用户模型和南方

Dmi*_*sky 8 django django-south

我正在尝试以最基本的方式使用自定义用户模型,扩展AbstractUserExtending Django的默认用户所述.但是,我不确定如何正确地与南方合作.我在进行初始模式迁移时遇到问题以下是发生的事情:

  • 我的扩展用户类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.
    
    Run Code Online (Sandbox Code Playgroud)
  • 所以,我启用了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
    
    Run Code Online (Sandbox Code Playgroud)

如果我跳过syncdb,我得到这个错误,因为syncdb有必要引导南:

$ ./manage.py migrate tournaments
DatabaseError: relation "south_migrationhistory" does not exist
LINE 1: ...gration", "south_migrationhistory"."applied" FROM "south_mig...
Run Code Online (Sandbox Code Playgroud)

所以,看来我在这里有一个鸡/蛋的情况:我不能syncdb没有我的用户模型.但是,如果我syncdb使用我的用户模型,我无法执行初始迁移!

解决这个问题的最佳方法是什么?我有一些想法,比如在syncdb没有启用django.contrib.authdjango.contrib.admin启用的情况下运行初始化,或者在syncdbsouth启用的情况下运行初始化然后转换应用程序.这两个选项看起来都很奇怪.

Tho*_*mas 9

试试跑步./manage.py migrate tournaments --fake 0001.这将在南迁移历史记录中添加一个条目,表示初始迁移已运行,而不实际执行SQL.或者,您可以设置class Meta: managed = False自定义用户对象,告诉django不要同步syncdb该模型.