需求:
我在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
)
|
獲取表中所有對象,
注意:由於User表中有多個對象,所以用User.objects.all()獲取到的是一個對象的集合,即列表。
這個集合是可以迭代的,可以用以下代碼,在按照自己的需求,展示數據
1
2
3
4
5
6
7
8
9
10
|
def
get_user(request):
users = models.User.objects.all()
for
user
in
users:
user_list
=
[]
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
)#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-1、在程序中訪問api,獲取數據
import requests res = requests.get('http://127.0.0.1:8000/api/get_user/') print(res.json()) 輸出:[{'年齡': '18', '郵箱': '123@qq.com', '姓名': '王騰'}, {'年齡': '23', '郵箱': '23@qq.com', '姓名': '微軟'},
{'年齡': '34', '郵箱': '23@qq.com', '姓名': '天賦'}]
5-2、在網頁訪問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這個用戶在頁面上不顯示了