没有显式外键的 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"
  }
)