需求:
我在learn这个app下创建了两张表,其中一个表为user,我希望通过API,在页面是展示这些数据,当用户访问指定的url时,将表中所有对象展示到页面上。
先看learn/models.py文件代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#coding:utf8
from
django.db
import
models
class
Group(models.Model):
Name
=
models.CharField(max_length
=
20
)
def
user_list(
self
):
return
','
.join([i.Name
for
i
in
self
.user_set.
all
()])
def
__unicode__(
self
):
return
self
.Name
class
User(models.Model):
Name
=
models.CharField(max_length
=
20
)
Email
=
models.CharField(max_length
=
50
)
group
=
models.ManyToManyField(Group,blank
=
True
)
def
__unicode__(
self
):
return
self
.Name
def
group_list(
self
):
return
','
.join([i.Name
for
i
in
self
.group.
all
()])
|
表中的数据如下
我希望访问一个url获取到user表中的数据,像这样:
这种需求非常常见,比如公司有CMDB,我可以通过API去获取某个表里面的数据,然后去添加监控什么的。
下面是具体的操作方法:
1、新建一个名为api的APP,并加入到settings.py文件中的INSTALLED_APPS中
1
|
django-admin startapp api
|
2、在api这个app下,创建urls.py文件,并在mysite/usrls.py文件中include app/urls.py文件
3、编辑api/views.py文件。创建一个函数,用来响应来自urls.py中定义的url的请求
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
#coding:utf8
from
django.http
import
HttpResponse,JsonResponse
from
django.shortcuts
import
render
from
learn.models
import
*
##别忘了从learn/models.py文件中导入User对象
# Create your views here.
def
get_user(request):
p
=
request.GET.get(
'Email'
)
q
=
request.GET.get(
'group'
)
user_list
=
[]
users
=
User.objects.
all
()
if
p:
users
=
User.objects.
filter
(Email
=
p)
if
q:
users
=
User.objects.
filter
(group__Name__icontains
=
q)
for
user
in
users:
user_list.append({
u
'姓名'
: user.Name,
u
'邮箱'
: user.Email,
u
'所属组'
:
','
.join([i.Name
for
i
in
user.group.
all
()])
})
return
JsonResponse(user_list,safe
=
False
)
|
获取表中所有对象,
1
|
users
=
User.objects.
all
()
|
注意:由于User表中有多个对象,所以用User.objects.all()获取到的是一个对象的集合,即列表。
这个集合是可以迭代的,可以用以下代码,在按照自己的需求,展示数据
1
2
3
4
5
6
7
8
9
10
|
def
get_user(request):
for
user
in
users:
user_list
=
[]
users
=
User.objects.
all
()
user_list.append({
u
'姓名'
: user.Name,
u
'邮箱'
: user.Email,
u
'所属组'
:
','
.join([i.Name
for
i
in
user.group.
all
()])
})
return
JsonResponse(user_list,safe
=
False
)
|
4、编辑api/urls.py文件,
1
2
3
4
5
6
7
|
#coding:utf8
from
django.conf.urls
import
url
from
django.contrib
import
admin
from
api.views
import
*
urlpatterns
=
[
url(r
'^get_user/'
, get_user),
]
|
5、访问api,获取user表中的数据
6、获取指定的用户的信息
上面的api展示的user表中所有的对象,我们可以查询指定的对象,并展示
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
#coding:utf8
from
django.http
import
HttpResponse,JsonResponse
from
django.shortcuts
import
render
from
learn.models
import
*
##别忘了从learn/models.py文件中导入User对象
# Create your views here.
def
get_user(request):
p
=
request.GET.get(
'Email'
)
q
=
request.GET.get(
'group'
)
user_list
=
[]
users
=
User.objects.
all
()
if
p:
users
=
users.objects.
filter
(Email
=
p)
if
q:
users
=
users.objects.
filter
(group__Name__icontains
=
q)
for
user
in
users:
user_list.append({
u
'姓名'
: user.Name,
u
'邮箱'
: user.Email,
u
'所属组'
:
','
.join([i.Name
for
i
in
user.group.
all
()])
})
return
JsonResponse(user_list,safe
=
False
)
|
1
2
|
p
=
request.GET.get(
'Email'
)
q
=
request.GET.get(
'group'
)
|
获取客户端浏览器中url地址里面Email和group对应的值。
1
2
3
4
|
if
p:
users
=
User.objects.
filter
(Email
=
p)
if
q:
users
=
User.objects.
filter
(group__Name__icontains
=
q)
|
然后通过filter方法进行过滤。
1
|
user
=
User.objects.
filter
(Email
=
"abc@qq.com"
)
|
获取Email为abc@qq.com的对象。
如果是多对多关系的属性,需要这样写
1
|
users
=
User.objects.
filter
(group__Name__icontains
=
q)
|
group__Name(中间是双下划线)表示user表中group字段的属性链接到对应的Group表中的Name字段上。
如果想模糊查询,可以使用icontains方法。Name后面是双下划线"_"
1
|
group__Name__icontains
|
7、查询邮箱为“a@qq.com”的对象
8、查询所属组的组名中带有“CO”的
9、组合查询
查询所属组为COO,邮箱为a@qq.com的对象
补充:
1、 QuerySet 查询结果排序
1
2
|
User.objects.
all
().order_by(
'Name'
)
User.objects.
all
().order_by(
'-Name'
)
##在字段名前面加“-”,表示实现倒叙
|
这里我修改了表中用户的姓名,如图
修改api/views.py代码
再次访问api
2、排除符合条件的对象
1
|
User.objects.
all
().order_by(
'Name'
).exclude(Name
=
'www'
)
|
找出所有对象,但排除Name为‘www’的对象
访问api
修改api/views.py后再次访问,发现www这个用户在页面上不显示了