在Danjao中对单表进行查询是最基本的操作,其余的增加,删除,修改都是在查询的基础上实现的。
最基本的查询一般是通过filter过滤或者 all获取所有的值
例1:最基本用法
id等于一,而且名字等于root的条件
models.User.objects.filter(id=1,name=‘root‘)
id大于一,而且名字是root的条件
models.User.objects.filter(id__gt=1,name=‘root‘)
id小于1的条件
models.User.objects.filter(id__lt=1)
filter内部的条件用字典的格式实现
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:
models.Business.objects.all().values(‘id‘,‘caption‘)
第三种方式是通过value_list来实现,这种方式获取的QuerySet,里面的每一个元素都是一个元祖
例3:
models.Business.objects.all().values_list(‘id‘,‘caption‘)
下面看看具体
views.py
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})控制台输出结果可以看见列表里面的元素分别是对象,字典和元祖。
<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 我不希望客户端直接看见,但是又希望调用,那么可以作为某个标签的一个属性存在。
<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指向了另外一个表
v=models.Host.objects.filter(nid__gt=0) v[0].b.caption
本文出自 “麻婆豆腐” 博客,请务必保留此出处http://beanxyz.blog.51cto.com/5570417/1950806
原文:http://beanxyz.blog.51cto.com/5570417/1950806