【问题标题】:Return results from more than one database table in Django从 Django 中的多个数据库表返回结果
【发布时间】:2019-11-02 11:09:11
【问题描述】:

假设我有 3 个假设模型;

class State(models.Model):
    name = models.CharField(max_length=20)

class Company(models.Model):
    name = models.CharField(max_length=60)
    state = models.ForeignField(State)

class Person(models.Model):
    name = models.CharField(max_length=60)
    state = models.ForeignField(State)

我希望能够在 Django 应用程序中返回结果,如果直接使用 SQL,结果将基于如下查询:

SELECT a.name as 'personName',b.name as 'companyName', b.state as 'State'
FROM Person a, Company b
WHERE a.state=b.state

我已经尝试按照here 的建议使用select_related() 方法,但我认为这不是我所追求的,因为我正在尝试加入两个具有共同外键但有它们之间没有关键关系。

有什么建议吗?

【问题讨论】:

    标签: sql django


    【解决方案1】:

    因为一个Person 可以有多个Companys 处于同一状态。在数据库级别执行JOIN 不是一个好主意。这意味着数据库将(可能)多次返回相同的Company,从而使输出非常大。

    我们可以通过以下方式预取相关公司:

    qs = Person.objects.select_related('state').prefetch_related(<b>'state__company'</b>)

    然后我们可以查询Companys处于相同状态:

    for person in qs:
        print(person.state.company_set.all())

    您可以使用Prefetch-object [Django-doc] 预取Person 的属性中的相关公司列表,例如:

    from django.db.models import Prefetch
    
    qs = Person.objects.prefetch_related(
        Prefetch('state__company', Company.objects.all(), to_attr='same_state_companies')
    )

    然后你可以打印公司:

    for person in qs:
        print(person.same_state_companies)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-09
      相关资源
      最近更新 更多