在 django 中加入 2 个表超过 2 列

Posted

技术标签:

【中文标题】在 django 中加入 2 个表超过 2 列【英文标题】:Join 2 tables over 2 columns in django 【发布时间】:2022-01-08 14:17:27 【问题描述】:

我在 models.py 中有一个从 mysql 导入的数据库,例如:

class Sig(models.Model):
id = models.IntegerField(db_column='Id', primary_key=True)
proportion = models.FloatField(db_column='Prop', blank=True, null=True)
marine_area = models.CharField(db_column='Marine_Area', max_length=255, blank=True, null=True)
habitat = models.CharField(db_column='Habitat', max_length=255, blank=True, null=True)

这个没有任何关联的坐标。坐标在另一个表中:

class Coord(models.Model):
id = models.IntegerField(db_column='Id', primary_key=True)
marine_area = models.CharField(db_column='Marine_Area', max_length=255, blank=True, null=True)
habitat = models.CharField(db_column='Habitat', max_length=255, blank=True, null=True)
latitude = models.FloatField(db_column='Latitude', blank=True, null=True)
longitude = models.FloatField(db_column='Longitude', blank=True, null=True)

我想根据坐标(纬度和经度)可视化我的比例。 但是,每个定位都定义了一个海洋区域和一个栖息地(每个海洋区域有 3 个栖息地)

for ex

那么如何创建一个连接海洋区域和栖息地的新列,以便能够加入我的两个表?

或者还有其他解决方案可以加入我的两个表吗?

谢谢!

【问题讨论】:

【参考方案1】:

所以当你说它是进口的时候并不完全确定你的意思,所以这可能不是你要找的:

我的解决方案是将 marine_areahabitat 转换为它们自己的模型(或者,如果这对您的用例最有效,您可以将它们设为一个模型)并使用您的两个模型中的 ForeignKey 关系假如。因此,例如,您可能有以下模型:

class Habitat(models.Model):
    name = models.CharField(max_length=255, blank=True, null=True)
    # ... other data

class MarineArea(models.Model):
    name = models.CharField(max_length=255, blank=True, null=True)
    habitats = models.ManyToManyField(Habitat, related_name="marine_areas")
    # ... other data

class Sig(models.Model):
    proportion = models.FloatField(db_column='Prop', blank=True, null=True)
    marine_area = models.ForeignKeyField(MarineArea, related_name="sigs")
    habitat = models.ForeignKeyField(Habitat, related_name="sigs")

class Coord(models.Model):
    marine_area = models.ForeignKeyField(MarineArea, relate_name="coords")
    habitat = models.ForeignKeyField(Habitat, related_name="coords")
    latitude = models.FloatField(db_column='Latitude', blank=True, null=True)
    longitude = models.FloatField(db_column='Longitude', blank=True, null=True)

这使您可以说marine_area.habitats.all() 并获取该海域所有栖息地的列表,或habitat.marine_areas.all() 获取具有该栖息地类型的所有海域的列表。然后,您可以使用 ForeignKeys 将 SigCoord 关联回 HabitatMarineArea 模型。

如果您对数据没有这么多的控​​制权,那么最好使用原始查询。

【讨论】:

OP 说他已经有一个 MySQL 数据库,他们正在使用这些模型...... 是的,这就是我编辑评论的原因。根据用例,在技术上仍然可以分解。否则(正如我在最后添加的那样)原始查询将是他们最好的选择 afaik。 是的,还有.extra,但真的不推荐这样......:耸耸肩: 我可以对我的数据进行这种控制,但它太多了,因为我有 50 个表与这个问题有关...... 我在views.py中尝试了一个查询:new_col = SigMpaCoord.objects.annotate(full_name = Concat('marine_area', Value(' '), 'habitat')) --> 但我只有它在我的终端上,我不能让它加入表格之后

以上是关于在 django 中加入 2 个表超过 2 列的主要内容,如果未能解决你的问题,请参考以下文章

在 codeigniter 中加入超过 2 个数据库表错误:1066

如何在需要按一个键列分组的 3 个表中加入和求和值

在pyspark中加入2个表,多个条件,左连接?

在 Google bigquery 中加入 3 个表

在 C# Access 数据库中加入 2 个表

在 like 语句中加入 SQL Server 表