简体   繁体   English

Django模型不会使用OneToOne字段进行迁移

[英]Django model wont migrate using a OneToOne field

When I try to run migrate my new models using python manage.py migrate , I get the following error: 当我尝试使用python manage.py migrate运行迁移新模型时,出现以下错误:

AssertionError: OneToOneField() is invalid. AssertionError:OneToOneField()无效。 First parameter to ForeignKey must be either a model, a model name, or the string 'self' ForeignKey的第一个参数必须是模型,模型名称或字符串“ self”

This is my models.py : 这是我的models.py

class Server_DefaultChannel():
  channel_id    = models.BigIntegerField(default=0)
  name          = models.CharField(default='undefined', max_length=32)
  channel_type  = models.IntegerField(default='-1')

class Server_Inviter(models.Model):
  avatar        = models.CharField(default='undefined', max_length=64)
  discriminator = models.IntegerField(default=0)      
  inviter_id    = models.BigIntegerField(default=0)
  username      = models.CharField(default='undefined', max_length=32)

class Server_Guild(models.Model):  
  features    = ArrayField(models.CharField(default = 'undefined', max_length = 64)) 
  icon        = models.CharField(default = 'undefined', max_length = 64)
  guild_id    = models.BigIntegerField(default=0)
  name        = models.CharField(default = 'undefined', max_length = 128)
  splash      = models.CharField(default = 'undefined', max_length = 64)
  description = models.CharField(default = 'undefined', max_length = 256)
  vanity_url  = models.CharField(default = 'undefined', max_length = 128) 

class Discord_Server(models.Model):
  approximate_member_count      = models.IntegerField(default=-1)
  approximate_presence_count    = models.IntegerField(default=-1)
  server_defaultchannel         = models.OneToOneField(Server_DefaultChannel, on_delete=models.PROTECT, null=True)
  code                          = models.CharField(max_length=32)
  server_guild                  = models.OneToOneField('migratefire.Server_Guild', on_delete=models.PROTECT, null=True)
  server_inviter                = models.OneToOneField('migratefire.Server_Inviter', on_delete=models.PROTECT, null=True)
  server_tags                   = ArrayField(models.CharField(default='none', max_length=16))
  last_checked                  = models.DateTimeField(default=0)`

I've tried putting the app name in the meta field for each class, I've tried using strings instead and got this error: 我尝试将应用程序名称放在每个类的meta字段中,尝试使用字符串代替并出现以下错误:

ERRORS: migratefire.Discord_Server.server_defaultchannel: (fields.E300) Field defines a relation with model 'migratefire.Server_DefaultChannel', which is either not installed, or is abstract. 错误:migrationfire.Discord_Server.server_defaultchannel:(fields.E300)字段定义了与模型'migratefire.Server_DefaultChannel'的关系,该关系未安装或为抽象。 migratefire.Discord_Server.server_defaultchannel: (fields.E307) The field migratefire.Discord_Server.server_defaultchannel was declared with a lazy reference to 'migratefire.server_defaultchannel', but app 'migratefire' doesn't provide model 'server_defaultchannel'. migratefire.Discord_Server.server_defaultchannel:(fields.E307)声明了migratefire.Discord_Server.server_defaultchannel字段,并带有对“ migratefire.server_defaultchannel”的惰性引用,但应用程序“ migratefire”未提供模型“ server_defaultchannel”。

Please help, I have no idea why other code examples work and not mine. 请帮助,我不知道为什么其他代码示例可以正常工作,而不是我的。

I solved my own problem, I seemed to have forgot to pass the models.Model parameter in the Server_DefaultChannel class declaration: 我解决了自己的问题,似乎忘了传递Server_DefaultChannel类声明中的models.Model参数:

class Server_DefaultChannel(models.Model):
  channel_id    = models.BigIntegerField(default=0)
  name          = models.CharField(default='undefined', max_length=32)
  channel_type  = models.IntegerField(default='-1')

Resulted in a successful migration. 导致成功迁移。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM