【问题标题】:Django ORM - LEFT JOIN Table2 ON Table2.Column = 123Django ORM - 在 Table2.Column = 123 上左连接 Table2
【发布时间】:2015-10-15 15:19:29
【问题描述】:

我想要达到的目标:

http://sqlfiddle.com/#!5/dccc4/5

数据库方案:

CREATE TABLE Table1 
(
 idTable1 integer primary key
);

CREATE TABLE Table2
(
  idTable1 integer,
  user_id integer,
  num integer
);

INSERT INTO Table1 (idTable1) VALUES (1);
INSERT INTO Table1 (idTable1) VALUES (2);
INSERT INTO Table2 (idTable1, user_id, num) VALUES (1, 11, 111);
INSERT INTO Table2 (idTable1, user_id, num) VALUES (1, 22, 222);

原始 SQL 查询:

SELECT    T1.idTable1,
          IFNULL(T2.num, 0) num
FROM      Table1 T1
LEFT JOIN Table2 T2 
ON        T1.idTable1 = T2.idTable1 
AND       T2.user_id  = 11
WHERE     T1.idTable1 = 1

结果查询集

| idTable1 | num |
|----------|-----|
|        1 | 111 |

是否可以使用 Django ORM 进行编码?

更新

型号为:

class Table1(models.Model):
    # ...

class Table2(models.Model):
    user = models.ForeignKey(User)
    table1 = models.ForeignKey(Table1)

    num = models.IntegerField(null=True)

【问题讨论】:

    标签: sql django django-models django-orm


    【解决方案1】:

    类似这样的:

    from django.db.models import Q, Value as V
    from django.db.models.functions import Coalesce
    
    objects = Table1.objects.filter(
                  Q(table2__isnull=True) | Q(table2__user=11),
                  id=1
              ).annotate(
                  num=Coalesce('table2__num', V(0))
              ).values('id', 'num')
    

    它是LEFT JOIN,但我不知道Django 是否可以在... LEFT JOIN ... ON ... AND ... WHERE 之类的查询中构造AND 部分。在这种情况下,最终结果是相同的(我希望)。

    【讨论】:

    • 这给了我 INNER JOIN 而不是 LEFT JOIN:SELECT "myApp_Table1"."idTable1", COALESCE("myApp_Table2"."number", 0) AS "number" FROM "myApp_Table1" INNER JOIN " myApp_Table2" ON (myApp_Table1"."idTable1" = "myApp_Table2"."idTable1") WHERE ("myApp_Table2"."user_id" = 11 AND "myApp_Table1"."idTable1" = 1)
    • 太棒了!非常感谢!
    猜你喜欢
    • 2012-04-15
    • 2018-12-04
    • 2023-01-25
    • 1970-01-01
    • 1970-01-01
    • 2014-01-20
    • 2020-05-18
    • 2014-03-13
    • 2011-03-19
    相关资源
    最近更新 更多