django 迁移admin.0001_initial在其依赖项app.0001_initial之前应用于数据库“default”

1l5u6lss  于 2023-03-13  发布在  Go
关注(0)|答案(2)|浏览(152)

我试图使定制的用户模型为我的项目在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)

设置.py中:

AUTH_USER_MODEL = 'app.myCustomeUser'

这里admin.site.register也是在admin.py中完成的,现在我尝试migratemakemigrations时,在终端中显示以下消息:

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'.

这是什么意思?我也不想在这个myCustomeUser模型中设置usernamepassword的默认值。另外请建议我,这是制作usermodel的正确方法吗?

llycmphe

llycmphe1#

我也遇到了同样的问题,但我只是从每个应用程序中删除了我的迁移,删除了数据库,并创建了一个新的。
一个月一个月一个月一个月一个月
进行新的迁移,一切正常。

aelbi1ox

aelbi1ox2#

如果您在没有包含自定义用户模型迁移文件的情况下完成了第一次初始迁移,通常会发生此错误。
“admin.0001_initial在其依赖项custom_user_app_label.0001_initial之前应用于数据库'default'”
因为初学者总是先做初始迁移,然后创建一个自定义用户。在第一次迁移中,它将迁移所有内置的Django应用程序,包括admin。现在有了自定义用户模型,Django希望它是第一次执行的初始迁移。
请参见Django docs在项目中期更改为自定义用户模型。
由于Django对可交换模型的动态依赖特性的限制,AUTH_USER_MODEL引用的模型必须在其应用的第一次迁移中创建(通常称为0001_initial);否则,你会有依赖性问题。
在我的例子中,我安装了Django v4.1。
以下是我重现问题的方式:

  • 我之前已经迁移了我的应用程序。
  • 已创建自定义User
  • 已将应用程序添加到INSTALLED_APPS中。
  • 已创建迁移文件python manage.py makemigrations
  • 通过AUTH_USER_MODEL = 'myapp_label.User'AUTH_USER_MODEL设置为新的自定义User
  • 将迁移错误问题作为OP。

以下是我解决问题的方法:

  • 删除数据库,但不要删除User初始迁移。
  • 确保在0001_initial.py-〉类中Migration.initial设置为True
  • 运行迁移python manage.py migrate
  • 您的User初始迁移应是迁移执行顺序中的第一个迁移文件。请参阅此迁移输出示例:
Running migrations:
 Applying myapp_label.0001_initial... OK
 Applying contenttypes.0001_initial... OK
 Applying admin.0001_initial...

正如您所看到的,它首先执行,然后是contenttypes,最后是admin。

相关问题