【问题标题】:How to perform Outer Joins using Django ORM?如何使用 Django ORM 执行外部联接?
【发布时间】:2021-06-23 13:52:02
【问题描述】:

我有以下型号:

class Partner(models.Model):
    partner_name = models.CharField(max_length=50)

class Allocation(models.Model):
    partner = models.ForeignKey(
        Partner,
        related_name='partner_allocations',
        on_delete=models.CASCADE
    )
    is_allocated = models.BooleanField(default=False)

通过使用 Django ORM,我需要带有列的连接表 ['partner_name', 'partner_id', 'is_allocated']。

所有合作伙伴名称(也不相关),以及分配模型中的相关数据。

SQL = SELECT partner.id, allocation.partner_id, allocation.is_allocated 
      FROM Partner LEFT OUTER JOIN Allocation ON Partner.id=Allocation.partner_id

SQL = SELECT partner.id, allocation.partner_id, allocation.is_allocated 
      FROM Allocation RIGHT OUTER JOIN Partner ON Allocation.partner_id=Partner.id

上述 SQL 使用 Django ORM 的输出。

这里的 SQL 查询语法可能有误,但它们给出了总体思路。

我只想将原始 SQL 用作最后一个选项。

请,有人可以帮忙。

【问题讨论】:

  • 不幸的是,您无法通过使用 ORM(除非您深入了解)(轻松地)执行此连接。您应该考虑使用prefetch_related - Django docs。虽然这会执行一些额外的查询。 ORM 不直接支持此类连接的主要原因(我相信)是通过多次存储同一个对象来防止过度使用内存。

标签: django django-orm django-select-related


【解决方案1】:

在django中很容易通过ORM来访问数据,例如:

allocation = Allocation.objects.get(id=1)
# access to partner object
print(allocation.partner)
print(allocation.partner.partner_name)

allocations = Allocation.objects.all()
for allocation in allocations:
    print(allocation.partner.partner_name)

# or
allocations = Allocation.objects.all().values('partner__id', 'partner__name', 'is_allocated')
for allocation in allocations:
    print(allocation['partner__name'])

【讨论】:

    猜你喜欢
    • 2018-04-08
    • 2013-09-18
    • 2018-06-28
    • 1970-01-01
    • 2018-04-26
    • 1970-01-01
    • 1970-01-01
    • 2017-10-27
    • 1970-01-01
    相关资源
    最近更新 更多