【问题标题】:django integrity error, i know why, but dont know how to solvedjango完整性错误,我知道为什么,但不知道如何解决
【发布时间】:2013-08-01 16:43:30
【问题描述】:

我改变了我以前的用户模型,现在它继承自 django 的用户模型。

from django.contrib.auth.models import User

class UserProfile(User):
 #fields..

但其他模型指向我以前的模型,现在如果我想迁移,我收到错误:

(user_id)=(9) does not exist in auth_user table. 

合理的错误信息。但是我现在该怎么办?我真的被困住了。我正在使用 django 1.4 版

我做了错误截图:

【问题讨论】:

    标签: python django django-models database-migration


    【解决方案1】:

    你没有说你使用的是什么版本的 Django;如果您使用的是 1.5,那么您还需要设置 AUTH_USER_MODEL 设置来告诉 Django 使用它(有关更多信息,请参阅auth docs)。如果您使用的是早期版本,您可能根本不想子类化 User 模型,而是创建一个配置文件(如您的类名称所示)作为单独的模型并将其与 ForeignKey 链接(请参阅old profile docs了解更多信息)。

    你添加父类的时候是不是也改了模型的名字?您可能希望在 UserProfile 中设置表的名称,使其与旧名称匹配。来自Django model docs

    为了节省您的时间,Django 自动从您的模型类和包含它的应用程序的名称中派生数据库表的名称。模型的数据库表名是通过将模型的“应用标签”(您在 manage.py startapp 中使用的名称)与模型的类名连接起来而构建的,它们之间使用下划线。

    例如,如果您有一个应用书店(由 manage.py startapp bookstore 创建),定义为类 Book 的模型将有一个名为 bookstore_book 的数据库表。

    要覆盖数据库表名,请使用 Meta 类中的 db_table 参数。

    所以这样的事情就可以解决问题:

    class UserProfile(User):
        # other stuff
        class Meta:
            db_table = "myapp_user"
    

    希望这会有所帮助!

    【讨论】:

    • 谢谢保罗,帮了大忙。我想,子类化和放置外键是一回事。我正在使用 django1.4
    猜你喜欢
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    • 2021-10-28
    • 2014-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多