在 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_area
和 habitat
转换为它们自己的模型(或者,如果这对您的用例最有效,您可以将它们设为一个模型)并使用您的两个模型中的 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 将 Sig
和 Coord
关联回 Habitat
和 MarineArea
模型。
如果您对数据没有这么多的控制权,那么最好使用原始查询。
【讨论】:
OP 说他已经有一个 MySQL 数据库,他们正在使用这些模型...... 是的,这就是我编辑评论的原因。根据用例,在技术上仍然可以分解。否则(正如我在最后添加的那样)原始查询将是他们最好的选择 afaik。 是的,还有.extra
,但真的不推荐这样......:耸耸肩:
我可以对我的数据进行这种控制,但它太多了,因为我有 50 个表与这个问题有关......
我在views.py中尝试了一个查询:new_col = SigMpaCoord.objects.annotate(full_name = Concat('marine_area', Value(' '), 'habitat')) --> 但我只有它在我的终端上,我不能让它加入表格之后以上是关于在 django 中加入 2 个表超过 2 列的主要内容,如果未能解决你的问题,请参考以下文章