我正在尝试为我的项目制作定制的用户模型Django
。
我的模型.py:
class myCustomeUser(AbstractUser):
id = models.AutoField(primary_key=True)
username = models.CharField(max_length=20, unique="True", blank=False)
password = models.CharField(max_length=20, blank=False)
is_Employee = models.BooleanField(default=False)
is_Inspector = models.BooleanField(default=False)
is_Industry = models.BooleanField(default=False)
is_Admin = models.BooleanField(default=False)
class Industry(models.Model):
user = models.OneToOneField(myCustomeUser, on_delete=models.CASCADE, primary_key=True, related_name='industry_releted_user')
name = models.CharField(max_length=200, blank=True)
owner = models.CharField(max_length=200, blank=True)
license = models.IntegerField(null=True, unique=True)
industry_extrafield = models.TextField(blank=True)
class Employee(models.Model):
user = models.OneToOneField(myCustomeUser, on_delete=models.CASCADE, primary_key=True, related_name='employee_releted_user')
industry = models.OneToOneField(Industry, on_delete=models.CASCADE, related_name='employee_releted_industry')
i_id = models.IntegerField(null=True, blank=False, unique=True)
name = models.CharField(max_length=200, blank=False, null=True)
gmail = models.EmailField(null=True, blank=False, unique=True)
rank = models.CharField(max_length=20, blank=False, null=True)
employee_varified = models.BooleanField(default=False)
class Inspector(models.Model):
user = models.OneToOneField(myCustomeUser, on_delete=models.CASCADE, primary_key=True, related_name='inspector_releted_user')
inspector_extrafield = models.TextField(blank=True)
class Admin(models.Model):
user = models.OneToOneField(myCustomeUser, on_delete=models.CASCADE, primary_key=True, related_name='admin_releted_user')
admin_extrafield = models.TextField(blank=True)
Run Code Online (Sandbox Code Playgroud)
在设置.py中:
AUTH_USER_MODEL = 'app.myCustomeUser'
Run Code Online (Sandbox Code Playgroud)
这里admin.site.register
也是在 中完成的admin.py
。migrate
现在,当我尝试或时,它在终端中显示以下消息makemigrations
:
Traceback (most recent call last):
File "manage.py", line 21, in <module>
main()
File "manage.py", line 17, in main
execute_from_command_line(sys.argv)
File "G:\Python\lib\site-packages\django\core\management\__init__.py", line 401, in execute_from_command_line
utility.execute()
File "G:\Python\lib\site-packages\django\core\management\__init__.py", line 395, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "G:\Python\lib\site-packages\django\core\management\base.py", line 328, in run_from_argv
self.execute(*args, **cmd_options)
File "G:\Python\lib\site-packages\django\core\management\base.py", line 369, in execute
output = self.handle(*args, **options)
File "G:\Python\lib\site-packages\django\core\management\base.py", line 83, in wrapped
res = handle_func(*args, **kwargs)
File "G:\Python\lib\site-packages\django\core\management\commands\makemigrations.py", line 101, in handle
loader.check_consistent_history(connection)
File "G:\Python\lib\site-packages\django\db\migrations\loader.py", line 295, in check_consistent_history
raise InconsistentMigrationHistory(
django.db.migrations.exceptions.InconsistentMigrationHistory: Migration admin.0001_initial is applied before its dependency app.0001_initial on database 'default'.
Run Code Online (Sandbox Code Playgroud)
这是什么意思?而且我也不想在这个模型中设置username
&的默认值。还请建议我,这是正确的制作方法吗?password
myCustomeUser
usermodel
Roe*_*oel 11
如果您在未包含自定义用户模型迁移文件的情况下完成了第一次初始迁移,通常会发生此错误。正如消息所说:
\n\n\n“admin.0001_initial 在数据库 \'default\' 上的依赖项 custom_user_app_label.0001_initial 之前应用”
\n
因为初学者总是会进行初始迁移,然后创建自定义用户。在第一次迁移中,它将迁移所有内置 Django 应用程序,包括admin
. 现在有了自定义用户模型,Django 希望它成为要执行的第一个初始迁移。
请参阅 Django 文档在项目中更改为自定义用户模型。
\n\n\n由于 Django\xe2\x80\x99s 对可交换模型的动态依赖功能的限制,AUTH_USER_MODEL 引用的模型必须在其应用程序的第一次迁移中创建(通常称为 0001_initial);否则,您\xe2\x80\x99将会遇到依赖性问题。
\n
就我而言,我安装了 Django v4.1。
\n这就是我重现问题的方式:
\nUser
.INSTALLED_APPS
.python manage.py makemigrations
AUTH_USER_MODEL
为新的自User
定义AUTH_USER_MODEL = \'myapp_label.User\'
这就是我解决问题的方法:
\n删除数据库但不要删除User
初始迁移。
确保在您的0001_initial.py
-> 类中Migration.initial
设置为True
.
运行迁移python manage.py migrate
您的User
初始迁移应该是迁移执行顺序中的第一个迁移文件。请参阅此迁移输出作为示例:
Running migrations:\n Applying myapp_label.0001_initial... OK\n Applying contenttypes.0001_initial... OK\n Applying admin.0001_initial...\n
Run Code Online (Sandbox Code Playgroud)\n正如您所看到的,它首先执行,然后是内容类型,然后是管理员。
\n