我有一个 Profile 模型,用于为身份验证应用程序中的用户定义配置文件。另外,我有一个信号,每次创建用户时都会创建一个空配置文件。
问题是,从 clean 开始时,Profile 表是在 User 表之后创建的,所以,当我被要求添加超级用户时,我的信号功能失败,因为没有 Profile 表可以进入空配置文件。
有没有办法强制syncdb创建表的顺序,以便在添加超级用户时应该已经创建了配置文件表?
我有一个 Profile 模型,用于为身份验证应用程序中的用户定义配置文件。另外,我有一个信号,每次创建用户时都会创建一个空配置文件。
问题是,从 clean 开始时,Profile 表是在 User 表之后创建的,所以,当我被要求添加超级用户时,我的信号功能失败,因为没有 Profile 表可以进入空配置文件。
有没有办法强制syncdb创建表的顺序,以便在添加超级用户时应该已经创建了配置文件表?
执行以下操作之一:
修改您的信号以捕获此特定错误(表不存在)并忽略它。如果您也需要超级用户的个人资料,这将无济于事。
在整个数据库模式初始化之前不要插入任何数据。您不必在 syncdb 期间创建超级用户,这可以稍后从开发控制台 ( django-admin.py shell
) 完成,或者您可以将超级用户的 User 和 Profile 放到您的应用程序的initial_data.json
夹具中,该夹具在 syncdb 期间自动加载。这将重置它在同步数据库上的信息,但在某些情况下它是可以接受的。
首次访问时使用AutoOneToOneField
from lib 自动创建 Profile。django-annoying
这就是我自己解决这个问题的方法——不需要用信号重做现有的功能。以下是他们 wiki 中的一个示例:
from annoying.fields import AutoOneToOneField
class MyProfile(models.Model):
user = AutoOneToOneField(User, primary_key=True)
创建表的顺序取决于您在 INSTALLED_APPS 中的顺序
尝试使用 django.contrib.auth 上方的 Profile 移动您的应用
除非您使用带有外键检查的数据库,在这种情况下,可能需要首先使用 User 表。