向三个具有数据和奇怪列名的表添加关系

2024-04-27 04:25:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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)

Tags: keyid数据库truemodelmodelspostgreslength
3条回答

最后,我找到了一个解决办法:

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,)

要将关系添加到具有奇怪列名的现有表并键入,最好使用到\字段db \ u列。在这种情况下,Django不会尝试为关系创建标准id列。你知道吗

使用inspectdb从db表生成模型。你知道吗

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

关系

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

然后可以删除映射模型,该关系的表由Django生成。你知道吗

如果要保留已关联实例的数据,请使用映射模型中ManyToManyField的through键参数。你知道吗

在用于与模型KeywordsVideo关联的模型Mapping中,可以进行如下更改: 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字段。你知道吗

相关问题 更多 >