Django、ForeignKey 关系和 Q 或

Posted

技术标签:

【中文标题】Django、ForeignKey 关系和 Q 或【英文标题】:Django, ForeignKey relation, and Q or 【发布时间】:2012-09-29 19:31:46 【问题描述】:

我有一些问题。考虑 DB 中的这个数据模式(为简单起见,我省略了一些东西):

class Table1(Model):
   field1;
   field2;
   table2 = ForeignKey('Table2');

class Table2(Model):
   filed3;

现在样本数据:

Table2:
 id:1, field3: lola 
 id:2, field3: disney 

Table1:
 id:1, field1: foo, field2: bar, table2_id: 1 
 id:2, field1: lola, field2: bars, table2_id: null 

主要部分:

SQL 查询:

SELECT t1.*, t2.field3 
FROM table1 AS t1 LEFT JOIN table2 AS t2 ON t1.table2_id=t2.id 
WHERE t1.field1 ILIKE '%lola%' OR t2.field3 ILIKE '%lola%';

将在 Table1 中生成两行:id=1 和 id=2。

现在我想从 django 得到同样的结果,但是当我尝试时:

Table1.objects.filter( Q(filed1__icontains="lola") | Q(table2__filed3__icontains="lola") );

它只返回 id=1,因为 table2_id 在 id=2 的行上为空。

它排除了 id=2 的行,因为它在第二个 Q 上失败了。 在那种情况下,我怎样才能从 Django 中获取两行?

有什么想法吗?

【问题讨论】:

【参考方案1】:

据我了解,数据库架构不是通过 django-orm 创建的。在你的情况下,Django 制作INNER JOIN。使用:

table2 = ForeignKey('Table2', blank=True, null=True)

【讨论】:

我觉得应该是 ForeignKey('Table2', blank=True, null = True)

以上是关于Django、ForeignKey 关系和 Q 或的主要内容,如果未能解决你的问题,请参考以下文章

Django 第六篇ORM跨表操作(聚合查询,分组查询,F和Q查询等)

Django Admin 中的 ForeignKey 或 ManyToMany 字段搜索

django model中foreignKey的self怎么理解?

Django - 将 ForeignKey 关系更改为 OneToOne

来自 ForeignKey 的 django 反向关系查询

Django模型中的OneToOneField和ForeignKey有啥区别