【问题标题】:Django ORM join without explicit Foriegn Key没有显式外键的 Django ORM 加入
【发布时间】:2023-03-17 17:40:01
【问题描述】:

我有两个示例模型:

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 来完成。

【问题讨论】:

    标签: django python-2.7 django-models django-1.5


    【解决方案1】:

    ORM 将相关数据的加入和检索委托给数据库。正如文档所说,Django“tak[es] care of the SQL JOINs for you automatically, behind the scenes”。如果您没有在模型中指定外键,则数据库没有任何链接两个表的概念。如果你不做额外的工作,Django ORM 将无法跨越两个表之间的关系——无论是在原始 SQL 中,还是通过在 Python 中手动连接多个 ORM 查询。

    【讨论】:

    • 我不相信这个答案(即使在编辑之前)有任何错误。有人看到我需要更新的内容吗?
    【解决方案2】:

    这是我在不完全使用 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"
      }
    )
    

    【讨论】:

      【解决方案3】:

      这样做的唯一方法是通过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 - 如果我之前的假设是错误的,你需要添加一个 ForeignKey。

      2 - 如果你想通过其他属性加入,你不能,你需要添加一个ForeignKey

      【讨论】:

        猜你喜欢
        • 2018-10-21
        • 1970-01-01
        • 2021-11-30
        • 1970-01-01
        • 1970-01-01
        • 2010-12-09
        • 1970-01-01
        • 2014-08-30
        • 2013-07-13
        相关资源
        最近更新 更多