8

我正在尝试以最基本的方式使用自定义用户模型,AbstractUserExtending Django's default User中所述进行扩展。但是,我不确定如何正确地使用 South。我在进行初始架构迁移时遇到了问题,情况如下:

  • 我的扩展用户类 ,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需要引导 South:

$ ./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.authdjango.contrib.admin启用的情况下运行初始设置,或者在syncdbsouth启用的情况下运行初始设置然后转换应用程序。这两种选择看起来都很老套和奇怪。

4

3 回答 3

9

尝试运行./manage.py migrate tournaments --fake 0001。这将在南迁移历史中添加一个条目,说明初始迁移已运行,但并未实际执行 SQL。或者,您可以class Meta: managed = False在自定义用户对象上设置以告诉 django 永远不要同步该模型。

于 2013-04-08T04:24:48.687 回答
2

这有效:

  • 评论django.contrib.authdjango.contrib.admintournament(我的自定义用户模型的应用程序在settings.INSTALLED_APPS.
  • manage.py syncdb
  • 取消注释django.contrib.authdjango.contrib.admin并且tournament
  • manage.py schemamigration tournaments --initial
  • manage.py syncdb
  • manage.py migrate tournaments

相当hackey和可怕。很想知道更好的方法。

于 2013-04-08T04:25:19.813 回答
0

我遇到了完全相同的问题,但CommandError:即使我的应用程序中有我的应用程序INSTALLED_APPS并卸载了 South,我也会遇到问题。我确实在 South 找到了一张票,#1179,在这里。一位匿名发帖人与 Thomas 有类似的工作,但更复杂一些。他们确实说这是 South 而不是 Django 的问题,但我不知道我是如何卸载 South,将其从我的设备中删除的,但INSTALLED_APPS我仍然遇到完全相同的错误。

@dimadima 看起来托马斯的回答对你有帮助,但你能告诉我哪种方式对你有用,也许可以通过点击复选标记来接受他的回答吗?

于 2013-05-01T03:46:53.370 回答