django 將表數據通過API展示到頁面上(轉)


需求:

我在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  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  in  self .group. all ()])

 

表中的數據如下

wKioL1i4-rHiIVSiAAEERSN7H64451.png

 

我希望訪問一個url獲取到user表中的數據,像這樣:

wKiom1i4-ziilixjAACMapeuEss147.png

這種需求非常常見,比如公司有CMDB,我可以通過API去獲取某個表里面的數據,然后去添加監控什么的。

 

下面是具體的操作方法:

1、新建一個名為api的APP,並加入到settings.py文件中的INSTALLED_APPS中

1
django-admin startapp api

wKiom1i4_R2x717zAAXKtJG9GD4190.png-wh_50

 

 

2、在api這個app下,創建urls.py文件,並在mysite/usrls.py文件中include app/urls.py文件

wKioL1i4_b7wYJBJAAKEHcJnMLU423.png

 

 

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):
     =  request.GET.get( 'Email' )
     =  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  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  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表中的數據

wKiom1i4-ziilixjAACMapeuEss147.png

 

 

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):
     =  request.GET.get( 'Email' )
     =  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  in  user.group. all ()])
         })
     return  JsonResponse(user_list,safe = False )
1
2
=  request.GET.get( 'Email' )
=  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”的對象

wKiom1i5BoXCOPL9AABu0zR72yI042.png

8、查詢所屬組的組名中帶有“CO”的

wKiom1i5Bwai2BQDAACJ6hDu8gM638.png

 

9、組合查詢

查詢所屬組為COO,郵箱為a@qq.com的對象

wKiom1i5C-vyKfq_AABymzyC_6U413.png-wh_50

 

 

補充:

1、 QuerySet 查詢結果排序

1
2
User.objects. all ().order_by( 'Name' )
User.objects. all ().order_by( '-Name' ##在字段名前面加“-”,表示實現倒敘

這里我修改了表中用戶的姓名,如圖

wKiom1i5EOPj7WVnAADKMF7Oa34131.png-wh_50

 

修改api/views.py代碼

wKiom1i5ERPizS0GAAP5WE0i9ZY907.png-wh_50

 

再次訪問api

wKioL1i5EUei_qR8AADCfXKMcqc816.png-wh_50

 

 

2、排除符合條件的對象

1
User.objects. all ().order_by( 'Name' ).exclude(Name = 'www' )

找出所有對象,但排除Name為‘www’的對象

wKiom1i5Fy6RYuNyAAEDecvcDGs211.png

訪問api

wKioL1i5F3-waunEAADVtxP3mkI806.png-wh_50

修改api/views.py后再次訪問,發現www這個用戶在頁面上不顯示了

wKioL1i5GEKwOsL5AAQwgrbqdvw063.png-wh_50

wKiom1i5GEKCXFzXAACrXd232tY654.png-wh_50

 請務必保留此出處http://zengestudy.blog.51cto.com/1702365/1902980


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM