没有显式外键的 Django ORM 连接
Django ORM join without explicit Foriegn Key
我有两个示例模型:
class Property(models.Model):
address = models.CharField(max_length=45)
longitude = models.FloatField(null=True, blank=True)
latitude = models.FloatField(null=True, blank=True)
class Business(models.Model):
address = models.CharField(max_length=45)
name = models.CharField(max_length=45)
如果模型中没有 fk 关系,我如何查询商家并获取其名称、纬度和经度?目前我正在 运行 两个查询并迭代它们以制作一个字典。
我知道这可以用 raw 但我希望它可以通过 ORM 完成。
唯一的方法是通过 address
属性(两个模型中的公共属性)加入。假设它们是相同的并且地址仅与一个企业相关。
business = Business.objects.get(pk=your_businness_id)
property = Property.objects.filter(address=business.address)[0] # be careful here, because may be you have d
备注:
1 - 如果我之前的假设是错误的,你需要添加一个外键。
2 - 如果你想通过其他属性加入,你不能,你需要添加一个ForeignKey
。
ORM将相关数据的加入和检索委托给数据库。正如文档所说,Django“tak[es] care of the SQL JOINs for you automatically, behind the scenes”。如果您没有在模型中指定外键,则数据库没有任何链接两个表的概念。如果你不做额外的工作,Django ORM 将无法跨越两个表之间的关系——无论是在原始 SQL 中还是通过在 Python.[= 中手动连接在一起的多个 ORM 查询。 11=]
这是我在不完全使用 raw 的情况下所能得到的最接近的结果:
businesses = Business.objects.extra(
select={
"lat": "SELECT latitude FROM property_table WHERE business_table.address = property_table.address",
"lon": "SELECT longitude FROM property_table WHERE business_table.address = property_table.address"
}
)
我有两个示例模型:
class Property(models.Model):
address = models.CharField(max_length=45)
longitude = models.FloatField(null=True, blank=True)
latitude = models.FloatField(null=True, blank=True)
class Business(models.Model):
address = models.CharField(max_length=45)
name = models.CharField(max_length=45)
如果模型中没有 fk 关系,我如何查询商家并获取其名称、纬度和经度?目前我正在 运行 两个查询并迭代它们以制作一个字典。
我知道这可以用 raw 但我希望它可以通过 ORM 完成。
唯一的方法是通过 address
属性(两个模型中的公共属性)加入。假设它们是相同的并且地址仅与一个企业相关。
business = Business.objects.get(pk=your_businness_id)
property = Property.objects.filter(address=business.address)[0] # be careful here, because may be you have d
备注:
1 - 如果我之前的假设是错误的,你需要添加一个外键。
2 - 如果你想通过其他属性加入,你不能,你需要添加一个ForeignKey
。
ORM将相关数据的加入和检索委托给数据库。正如文档所说,Django“tak[es] care of the SQL JOINs for you automatically, behind the scenes”。如果您没有在模型中指定外键,则数据库没有任何链接两个表的概念。如果你不做额外的工作,Django ORM 将无法跨越两个表之间的关系——无论是在原始 SQL 中还是通过在 Python.[= 中手动连接在一起的多个 ORM 查询。 11=]
这是我在不完全使用 raw 的情况下所能得到的最接近的结果:
businesses = Business.objects.extra(
select={
"lat": "SELECT latitude FROM property_table WHERE business_table.address = property_table.address",
"lon": "SELECT longitude FROM property_table WHERE business_table.address = property_table.address"
}
)