16 Django-extra查询

知识点补充:
image

如何只拿出,dt字段中的年月字段?
image


知识点补充:extra

有些时候复杂的sql语句,Django无法去对应。

extra(select=None, where=None, params=None, tables=None, order_by=None, select_params=None )

有些情况下,Dj ango的查询语法难以简单的表达复杂的WHERE子句,对于这种情况,Django 提供了extra() QuerySet修改机制,它能在QuerySet生成的SQL从句中注入新子句

extra可以指定一个或多个参数,例如select, where or tables.这些参数都不是必须的,但是你至少要使用一个!要注意这些额外的方式对不同的数据库引擎可能存在移植性问题。(因为你在显式的书写SQL语句)

参数之select
The select 参数可以让你在SELECT 从句中添加其他字段信息,它应该是一个字典, 存放着属性名到SQL 从句的映射。

queryResult models.Article.objects.extra(select={'is_ recent': "create_ time > '2017-09- -05'"})
结果集中每个Entry 对象都有一个额外的属性is_ recent, 它是一个布尔值, 表示Article对象的create_ time是否晚于2017-09-05

练习1:

ret = models.Article.objects.extra(select={'is_recent': 'create_time > "2020-09-05"'}).values("title", "is_recent")

# <QuerySet [{'is_recent': 1, 'title': 'nginx的使用方式哈哈哈哈'}, {'is_recent': 1, 'title': 'python-mysql哈哈哈哈哈'}]>

# SELECT (create_time > "2020-09-05") AS `is_recent`, `blog_article`.`nid`, `blog_article`.`title`, `blog_article`.`desc`, `blog_article`.`create_time`, `blog_article`.`content`, `blog_article`.`comment_count`, `blog_article`.`up_count`, `blog_article`.`down_count`, `blog_article`.`user_id`, `blog_article`.`category_id` FROM `blog_article`

练习2:

ret = models.Article.objects.extra(select={'y_m_d_date': 'date_format(create_time, "%%Y-%%m-%%d")'}).values("title", "y_m_d_date")

print(ret)
# <QuerySet [{'y_m_d_date': '2022-08-17', 'title': 'nginx的使用方式哈哈哈哈'}, {'y_m_d_date': '2022-08-17', 'title': 'python-mysql哈哈哈哈哈'}]>

select参数,相当于对每一条查询的数据插入一个字段,如y_m_d_date。在格式化时间格式的字段,生成新的字段如 y_m_d_date

posted @ 2022-08-18 10:46  角角边  Views(112)  Comments(0)    收藏  举报