django - 自定义用户模型和南

标签 django django-south

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

  • 我的类 tournaments 中有扩展用户类 Player,该类在 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.
    
  • 因此,我启用了具有我的 Player(自定义用户)模型的 tournaments 应用。但是,在初始迁移时:

    $ ./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,我将无法执行初始迁移!

解决这个问题的最佳方法是什么?我有一些想法,例如在不启用 django.contrib.authdjango.contrib.admin 的情况下运行初始 syncdb,或者运行初始 syncdb 未启用 south,然后转换应用程序。这两种选择都显得老套又奇怪。

最佳答案

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

关于django - 自定义用户模型和南,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15871164/

相关文章:

python - Django 没有为模型创建数据库表(无论是 syncdb 还是 South)

django - 什么是 Django South GhostMigrations 异常以及如何调试它?

python - 将模板分成几个部分并包含每个部分不好吗?

Django db_index=True 不创建索引,但类元索引是

Python:列表到 JSON

django-south - 南和不能 DROP 'created_date' ;检查列/键是否存在”

带有 Django 1.7 迁移的 Python 2.7 未绑定(bind)方法

python - 使用 Django、npm 和 gulp 创建 Docker 容器

python - 如何测试访问数据库的其他线程

Django 代理模型权限不出现