django如何跨表查询
没获得到帮助
看了两天资料,终于找到方法,
使用字段查询in
a4=Xunjian.objects.values('bengfang')
a3=Bengfang.objects.exclude(id__in=a4).values('name')
print(a3)
可看到未巡检的泵房。
in的用法可百度刘江的博客和教程,在‘第一章,模型层’中的‘字段查询参数和聚合函数’ 展开
2019-01-05 · 百度知道官方认证企业
2、id 字段是自动添加的
3、对于外键字段,Django 会在字段名上添加"_id" 来创建数据库中的列名
4、这个例子中的CREATE TABLE SQL 语句使用PostgreSQL 语法格式,要注意的是Django 会根据settings 中指定的数据库类型来使用相应的SQL 语句。
5、定义好模型之后,你需要告诉Django _使用_这些模型。你要做的就是修改配置文件中的INSTALL_APPSZ中设置,在其中添加models.py所在应用的名称。
6、外键字段 ForeignKey 有一个 null=True 的设置(它允许外键接受空值 NULL),你可以赋给它空值 None 。
2024-09-04 广告
用NOT EXISTS
SELECT * FROM bengfang WHERE NOT EXISTS(SELECT 1 FROM xunjian WHERE bengfang.id=xunjian.id)
Django对EXISTS语句的支持并不好,生成的查询语句往往包含冗余,不是我们想要的,因此这里最好用RAW SQL:
Bengfang.objects.extra(where=[
'NOT EXISTS(SELECT 1 FROM "{xunjian}" WHERE "{bengfang}"."id"="{xunjian}"."bengfang_id")'.format(
bengfang=Bengfang._meta.db_table,
xunjian=Xunjian._meta.db_table
)])
2.用LEFT OUTER JOIN
SELECT * FROM bengfang LEFT OUTER JOIN xunjian ON bengfang.id=xunjian.id WHERE xunjian.id=NULL
这个情况下需要双方存在外键关系,也就是Xunjian模型中需要有一个属性是Bengfang的外键,比如bengfang = models.ForeignKey('Bengfang', related_name='xunjian')
那么对应的ORM语句是:
Bengfang.objects.filter(xunjian=None)
用到了反向引用,查询语句非常简单,但是效率要比NOT EXISTS低一些。
3.用NOT IN
SELECT * FROM bengfang WHERE id NOT IN(SELECT bengfang_id FROM xunjian)
Bengfang.objects.exclude(pk__in=Xunjian.object.values('bengfang_id'))
要注意的是NOT IN是没有索引的,当表较大的时候NOT IN的效率是要远远低于NOT EXISTS的,因此从性能上讲尽量不要去用NOT IN。