使用数据和奇怪的列名称向三个表添加关系

问题描述 投票:0回答:3

我有一个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)
python django postgresql
3个回答
0
投票

在您的模型Mapping中,用于与模型KeywordsVideo相关联,您可以进行如下更改: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字段和主键。


0
投票

使用inspectdb从db表生成模型。

$ ./manage.py inspectdb table1 table2 table3 >> models.py

关系

 class Video(models.Model):
      #...
      keywords = models.ManyToManyField(Keywords)

然后你可以删除Mapping模型,这个关系的表是由Django生成的。

如果要保留已经相关的实例的数据,请使用ManyToManyField的through关键参数和Mapping模型。


0
投票

最后,我找到了一个解决方案:

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列。

© www.soinside.com 2019 - 2024. All rights reserved.