我有一个Postgres数据库,其中包含3个表,其中包含Django中的数据及其模型。我无法控制这些表的填充方式。但我需要为他们添加关系。
对于MsSQL,Oracle或MySql来说,这不是问题。但我在这里很困惑。
class Keywords(models.Model):
id = models.AutoField(primary_key=True)
keyword = models.CharField(unique=True, max_length=250)
class Mapping(models.Model):
id = models.AutoField(primary_key=True)
keyword = models.CharField(max_length=250)
videoid = models.CharField(max_length=50)
class Video(models.Model):
videoid = models.CharField(primary_key=True, max_length=50)
在您的模型Mapping
中,用于与模型Keywords
和Video
相关联,您可以进行如下更改:class Mapping(models.Model):
id = models.AutoField(primary_key=True)
keyword = models.ForeignKey(Keywords, on_delete=models.CASCADE)
videoid = models.ForeignKey(Video, on_delete=models.CASCADE)
您也不需要为模型定义id,因为Django本身会创建一个自动生成的id字段和主键。
使用inspectdb从db表生成模型。
$ ./manage.py inspectdb table1 table2 table3 >> models.py
class Video(models.Model):
#...
keywords = models.ManyToManyField(Keywords)
然后你可以删除Mapping模型,这个关系的表是由Django生成的。
如果要保留已经相关的实例的数据,请使用ManyToManyField的through
关键参数和Mapping模型。
最后,我找到了一个解决方案:
class Mapping(models.Model):
id = models.AutoField(primary_key=True)
video = models.ForeignKey(Videos, to_field='videoid', db_column='videoid', on_delete=models.DO_NOTHING,blank=False,null=True,)
keyword = models.ForeignKey(Keywords, to_field='keyword', db_column='keyword', on_delete=models.DO_NOTHING, blank=False, null=True,)
要使用奇怪的列名称添加与现有表的关系并键入,最好使用to_field和db_column。在这种情况下,Django不会尝试为关系创建标准id列。