【问题标题】:django join two tables based on valuesdjango 根据值连接两个表
【发布时间】:2021-04-15 18:23:23
【问题描述】:

我有这样的 django 模型:

class A():
  attr_a

class B():
  attr_b1
  attr_b2
  attr_b
  attr_fa = models.ForeignKey(A, to_field='attr_a')

class C():
  attr_c1
  attr_c2
  attr_c
  attr_fa = models.ForeignKey(A, to_field='attr_a')


是否可以根据 B.attr_b = C.attr_c 和 B.attr_fa = C.attr_fa 连接表 B 和 C?

原始 sql 将是

select * from B, C where B.attr_b = C.attr_c and B.attr_fa = C.attr_fa

是否可以使用 Django 查询集来实现这一点?

无法联合,因为我还需要 attr_b1、attr_b2、attr_c1 等字段,当列不同时,我无法在两个查询集上联合

【问题讨论】:

    标签: python django


    【解决方案1】:

    您可以使用 union() 组合查询集:https://docs.djangoproject.com/en/3.2/ref/models/querysets/#union

    在黑暗中刺伤,但可能看起来像这样:

    qs1 = B.objects.filter(
        attr_b__in=C.objects.all().values_list("attr_c"), 
        attr_fa__in=C.objects.all().values_list("attr_fa")
    )
    
    qs2 = C.objects.filter(
        attr_c__in=B.objects.all().values_list("attr_b"),
        attr_fa__in=B.objects.all().values_list("attr_fa")
    )
    
    result_qs = qs1.union(qs2)
    

    【讨论】:

    • 无法联合,因为我还需要 attr_b1、attr_b2、attr_c1 等字段,当列不同时,我无法在两个查询集上联合
    • 在这种情况下,您可能只想执行手动 sql 查询:docs.djangoproject.com/en/3.2/topics/db/sql/… 如果您确实需要查询集,则可以根据自定义 sql 的结果运行 ORM 查询询问。 (B.objects.filter(id__in=[<B obj ids from custom sql>]) ...)
    • 正如我所提到的,我正在尝试找到一种 django 方法来做到这一点。另外,我需要从 B 和 C 中获取属性,所以 B.objects.filter 不能给我正确的结果。
    猜你喜欢
    • 2021-01-14
    • 2022-07-25
    • 2016-11-18
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    相关资源
    最近更新 更多