Django-models进阶
Posted 一只丶顽皮猫
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django-models进阶相关的知识,希望对你有一定的参考价值。
Django-models进阶
extra
extra(select=None, where=None, params=None,
tables=None, order_by=None, select_params=None)
3
1
extra(select=None, where=None, params=None,
2
tables=None, order_by=None, select_params=None)
3
有些情况下,Django的查询语法难以简单的表达复杂的 WHERE 子句,对于这种情况, Django 提供了 extra() QuerySet修改机制 — 它能在 QuerySet生成的SQL从句中注入新子句
extra可以指定一个或多个 参数,例如 select, where or tables. 这些参数都不是必须的,但是你至少要使用一个!要注意这些额外的方式对不同的数据库引擎可能存在移植性问题.(因为你在显式的书写SQL语句),除非万不得已,尽量避免这样做
警告
无论何时你都需要非常小心的使用extra(). 每次使用它时,您都应该转义用户可以使用params控制的任何参数,以防止SQL注入攻击。
参数之select
The select 参数可以让你在 SELECT 从句中添加其他字段信息,它应该是一个字典,存放着属性名到 SQL 从句的映射。queryResult=models.Article
.objects.extra(select={\'is_recent\': "create_time > \'2017-09-05\'"})
2
1
queryResult=models.Article
2
.objects.extra(select={\'is_recent\': "create_time > \'2017-09-05\'"})
结果集中每个 Entry 对象都有一个额外的属性is_recent, 它是一个布尔值,表示 Article对象的create_time 是否晚于2017-09-05.
date_list=models.Article.objects.filter(user=user_obj).extra(select={"fdate":"strftime(\'%%Y/%%m/%%d\',create_time)"}).values_list("fdate").annotate(Count("id"))
\'\'\'
输出结果:
<QuerySet [(\'2017/11/22\', 2), (\'2017/11/24\', 1)]>
\'\'\'
5
1
date_list=models.Article.objects.filter(user=user_obj).extra(select={"fdate":"strftime(\'%%Y/%%m/%%d\',create_time)"}).values_list("fdate").annotate(Count("id"))
2
\'\'\'
3
输出结果:
4
<QuerySet [(\'2017/11/22\', 2), (\'2017/11/24\', 1)]>
5
\'\'\'
参数之where / tables
您可以使用where定义显式SQL WHERE子句 - 也许执行非显式连接。您可以使用tables手动将表添加到SQL FROM子句。
where和tables都接受字符串列表。所有where参数均为“与”任何其他搜索条件。
举例来讲:
queryResult=models.Article
.objects.extra(where=[\'nid in (1,3) OR title like "py%" \',\'nid>2\'])
2
1
queryResult=models.Article
2
.objects.extra(where=[\'nid in (1,3) OR title like "py%" \',\'nid>2\'])
QuerySet
可切片
使用Python 的切片语法来限制查询集记录的数目 。它等同于SQL 的LIMIT 和OFFSET 子句。
>>> Entry.objects.all()[:5] # (LIMIT 5)
1
1
>>> Entry.objects.all()[:5] # (LIMIT 5)
不支持负的索引(例如Entry.objects.all()[-1])。通常,查询集 的切片返回一个新的查询集 —— 它不会执行查询。
可迭代
articleList=models.Article.objects.all()
for article in articleList:
print(article.title)
x
1
articleList=models.Article.objects.all()
2
3
for article in articleList:
4
print(article.title)
惰性查询
查询集 是惰性执行的 —— 创建查询集不会带来任何数据库的访问。你可以将过滤器保持一整天,直到查询集 需要求值时,Django 才会真正运行这个查询。
示例:
def queryTest(request):
ret=models.Article.objects.all().iterator()
for i in ret:
print(i)
return HttpResponse("ok")
输出结果:
#打印了就进行查询
\'\'\'
Quit the server with CTRL-BREAK.
(0.001) SELECT "app01_article"."id", "app01_article"."title", "app01_article"."desc", "app01_article"."read_count", "app01_article"."comment_count", "app01_article"."up_count", "app01_a
rticle"."down_count", "app01_article"."create_time", "app01_article"."category_id", "app01_article"."user_id", "app01_article"."site_article_category_id" FROM "app01_article"; args=()
bootstrap导航栏.nav与.navbar区别
[Python]循环嵌套nested loop-练习题
Java提高十五:容器元素比较Comparable&Comparator深入分析
dsds
sql
dsdsds
dsds
东京不太热
dsds
东京有点热
射太阳的人
\'\'\'
1
def queryTest(request):
2
ret=models.Article.objects.all().iterator()
3
for i in ret:
4
print(i)
5
return HttpResponse("ok")
6
输出结果:
7
#打印了就进行查询
8
\'\'\'
9
Quit the server with CTRL-BREAK.
10
(0.001) SELECT "app01_article"."id", "app01_article"."title", "app01_article"."desc", "app01_article"."read_count", "app01_article"."comment_count", "app01_article"."up_count", "app01_a
11
rticle"."down_count", "app01_article"."create_time", "app01_article"."category_id", "app01_article"."user_id", "app01_article"."site_article_category_id" FROM "app01_article"; args=()
12
bootstrap导航栏.nav与.navbar区别
13
[Python]循环嵌套nested loop-练习题
14
Java提高十五:容器元素比较Comparable&Comparator深入分析
15
dsds
16
sql
17
dsdsds
18
dsds
19
东京不太热
20
dsds
21
东京有点热
22
射太阳的人
23
\'\'\'
24
示例2:
以上是关于Django-models进阶的主要内容,如果未能解决你的问题,请参考以下文章
我的Android进阶之旅NDK开发之在C++代码中使用Android Log打印日志,打印出C++的函数耗时以及代码片段耗时详情