在Danjao中对单表进行查询是最基本的操作,其余的增加,删除,修改都是在查询的基础上实现的。
最基本的查询一般是通过filter过滤或者 all获取所有的值
例1:最基本用法
id等于一,而且名字等于root的条件
|
1
|
models.User.objects.
filter
(
id
=
1
,name
=
'root'
)
|
id大于一,而且名字是root的条件
|
1
|
models.User.objects.
filter
(id__gt
=
1
,name
=
'root'
)
|
id小于1的条件
|
1
|
models.User.objects.
filter
(id__lt
=
1
)
|
filter内部的条件用字典的格式实现
|
1
2
|
dic
=
{
'name'
:
'xx'
,
'age'
:
10
}
models.User.objects.
filter
(
*
*
dic)
|
在上面的例子中,获取的结果都是QuerySet类型,这个类型类似列表,里面每个元素都是一个完整的对象,拥有自己的属性,也就是表里每一行对应的字段。因此,如果需要获取列表里面的第一个元素,我们一般使用first(),比如v=models.Business.objects.filter(id=1).first(), 如果没有这个值,那么他返回的就是None;我们使用get()方法也可以获取表值,比如 models.Business.objects.get(id=1), 但是如果这个值不存在,那就直接报错了。因此比较推荐的方法是使用filter。
第二种查询方式是通过values来实现。通过这种方式获取的QuerySet,里面的每一个元素都是一个字典
例2:
|
1
|
models.Business.objects.
all
().values(
'id'
,
'caption'
)
|
第三种方式是通过value_list来实现,这种方式获取的QuerySet,里面的每一个元素都是一个元祖
例3:
|
1
|
models.Business.objects.
all
().values_list(
'id'
,
'caption'
)
|
下面看看具体
views.py
|
1
2
3
4
5
6
7
8
|
def
business(request):
v1
=
models.Business.objects.
all
()
v2
=
models.Business.objects.
all
().values(
'id'
,
'caption'
)
v3
=
models.Business.objects.
all
().values_list(
'id'
,
'caption'
)
print
(v1)
print
(v2)
print
(v3)
return
render(request,
'business.html'
, {
'v1'
: v1,
'v2'
: v2,
'v3'
: v3})
|
控制台输出结果可以看见列表里面的元素分别是对象,字典和元祖。
|
1
2
3
|
<QuerySet [<Business: Business
object
>, <Business: Business
object
>, <Business: Business
object
>, <Business: Business
object
>]>
<QuerySet [{
'caption'
:
'运维部'
,
'id'
:
1
}, {
'caption'
:
'开发'
,
'id'
:
2
}, {
'caption'
:
'市场'
,
'id'
:
3
}, {
'caption'
:
'测试'
,
'id'
:
4
}]>
<QuerySet [(
1
,
'运维部'
), (
2
,
'开发'
), (
3
,
'市场'
), (
4
,
'测试'
)]>
|
host.html
注意的是Python里面对象是通过点.来获取属性,字典通过dic['key']获取对应,元祖通过索引获取对应值
模板语言都是通过点来获取,即使字典的key和索引也是一样!
第二个注意的是有些值,比如id 我不希望客户端直接看见,但是又希望调用,那么可以作为某个标签的一个属性存在。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
<
html
lang
=
"en"
>
<
head
>
<
meta
charset
=
"UTF-8"
>
<
title
></
title
>
</
head
>
<
body
>
<
h1
>业务线列表(对象)</
h1
>
<
ul
>
{% for row in v1 %}
<
li
>{{ row.id }} - {{ row.caption }} - {{ row.code }}</
li
>
{% endfor %}
</
ul
>
<
h1
>业务线列表(字典)</
h1
>
<
ul
>
{% for row in v2 %}
<
li
>{{ row.id }} - {{ row.caption }}</
li
>
{% endfor %}
</
ul
>
<
h1
>业务线列表(元组)</
h1
>
<
ul
>
{% for row in v3 %}
<
li
>{{ row.0 }} - {{ row.1 }}</
li
>
{% endfor %}
</
ul
>
</
body
>
</
html
>
|
结果如下
最后值得一提的是外键的查询
例如 b指向了另外一个表
|
1
2
|
v
=
models.Host.objects.
filter
(nid__gt
=
0
)
v[
0
].b.caption
|
