简体   繁体   中英

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:

AssertionError: OneToOneField() is invalid. First parameter to ForeignKey must be either a model, a model name, or the string 'self'

This is my 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:

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

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:

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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