需求:
我在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
<code>#coding:utf8</code>
<code>from</code> <code>django.db </code><code>import</code> <code>models</code>
<code>class</code> <code>Group(models.Model):</code>
<code> </code><code>Name </code><code>=</code> <code>models.CharField(max_length</code><code>=</code><code>20</code><code>)</code>
<code> </code><code>def</code> <code>user_list(</code><code>self</code><code>):</code>
<code> </code><code>return</code> <code>','</code><code>.join([i.Name </code><code>for</code> <code>i </code><code>in</code> <code>self</code><code>.user_set.</code><code>all</code><code>()])</code>
<code> </code><code>def</code> <code>__unicode__(</code><code>self</code><code>):</code>
<code> </code><code>return</code> <code>self</code><code>.Name</code>
<code>class</code> <code>User(models.Model):</code>
<code> </code><code>Email </code><code>=</code> <code>models.CharField(max_length</code><code>=</code><code>50</code><code>)</code>
<code> </code><code>group </code><code>=</code> <code>models.ManyToManyField(Group,blank</code><code>=</code><code>True</code><code>)</code>
<code> </code><code>def</code> <code>group_list(</code><code>self</code><code>):</code>
<code> </code><code>return</code> <code>','</code><code>.join([i.Name </code><code>for</code> <code>i </code><code>in</code> <code>self</code><code>.group.</code><code>all</code><code>()])</code>
表中的資料如下
<a href="https://s1.51cto.com/wyfs02/M01/8E/36/wKioL1i4-rHiIVSiAAEERSN7H64451.png" target="_blank"></a>
我希望通路一個url擷取到user表中的資料,像這樣:
<a href="https://s4.51cto.com/wyfs02/M00/8E/39/wKiom1i4-ziilixjAACMapeuEss147.png" target="_blank"></a>
這種需求非常常見,比如公司有CMDB,我可以通過API去擷取某個表裡面的資料,然後去添加監控什麼的。
下面是具體的操作方法:
1、建立一個名為api的APP,并加入到settings.py檔案中的INSTALLED_APPS中
<code>django-admin startapp api</code>
2、在api這個app下,建立urls.py檔案,并在mysite/usrls.py檔案中include app/urls.py檔案
3、編輯api/views.py檔案。建立一個函數,用來響應來自urls.py中定義的url的請求
18
19
20
21
<code>from</code> <code>django.http </code><code>import</code> <code>HttpResponse,JsonResponse</code>
<code>from</code> <code>django.shortcuts </code><code>import</code> <code>render</code>
<code>from</code> <code>learn.models </code><code>import</code> <code>*</code> <code>##别忘了從learn/models.py檔案中導入User對象</code>
<code># Create your views here.</code>
<code>def</code> <code>get_user(request):</code>
<code> </code><code>p </code><code>=</code> <code>request.GET.get(</code><code>'Email'</code><code>)</code>
<code> </code><code>q </code><code>=</code> <code>request.GET.get(</code><code>'group'</code><code>)</code>
<code> </code><code>user_list </code><code>=</code> <code>[]</code>
<code> </code><code>users </code><code>=</code> <code>User.objects.</code><code>all</code><code>()</code>
<code> </code><code>if</code> <code>p:</code>
<code> </code><code>users </code><code>=</code> <code>User.objects.</code><code>filter</code><code>(Email</code><code>=</code><code>p)</code>
<code> </code><code>if</code> <code>q:</code>
<code> </code><code>users </code><code>=</code> <code>User.objects.</code><code>filter</code><code>(group__Name__icontains</code><code>=</code><code>q)</code>
<code> </code><code>for</code> <code>user </code><code>in</code> <code>users:</code>
<code> </code><code>user_list.append({</code>
<code> </code><code>u</code><code>'姓名'</code><code>: user.Name,</code>
<code> </code><code>u</code><code>'郵箱'</code><code>: user.Email,</code>
<code> </code><code>u</code><code>'所屬組'</code><code>: </code><code>','</code><code>.join([i.Name </code><code>for</code> <code>i </code><code>in</code> <code>user.group.</code><code>all</code><code>()])</code>
<code> </code><code>})</code>
<code> </code><code>return</code> <code>JsonResponse(user_list,safe</code><code>=</code><code>False</code><code>)</code>
擷取表中所有對象,
<code>users </code><code>=</code> <code>User.objects.</code><code>all</code><code>()</code>
注意:由于User表中有多個對象,是以用User.objects.all()擷取到的是一個對象的集合,即清單。
這個集合是可以疊代的,可以用以下代碼,在按照自己的需求,展示資料
<code>for</code> <code>user </code><code>in</code> <code>users:</code>
<code> </code><code>user_list.append({</code>
<code> </code><code>u</code><code>'姓名'</code><code>: user.Name,</code>
<code> </code><code>u</code><code>'郵箱'</code><code>: user.Email,</code>
<code> </code><code>u</code><code>'所屬組'</code><code>: </code><code>','</code><code>.join([i.Name </code><code>for</code> <code>i </code><code>in</code> <code>user.group.</code><code>all</code><code>()])</code>
4、編輯api/urls.py檔案,
<code>from</code> <code>django.conf.urls </code><code>import</code> <code>url</code>
<code>from</code> <code>django.contrib </code><code>import</code> <code>admin</code>
<code>from</code> <code>api.views </code><code>import</code> <code>*</code>
<code>urlpatterns </code><code>=</code> <code>[</code>
<code> </code><code>url(r</code><code>'^get_user/'</code><code>, get_user),</code>
<code>]</code>
5、通路api,擷取user表中的資料
6、擷取指定的使用者的資訊
上面的api展示的user表中所有的對象,我們可以查詢指定的對象,并展示
<code> </code><code>users </code><code>=</code> <code>users.objects.</code><code>filter</code><code>(Email</code><code>=</code><code>p)</code>
<code> </code><code>users </code><code>=</code> <code>users.objects.</code><code>filter</code><code>(group__Name__icontains</code><code>=</code><code>q)</code>
<code>p </code><code>=</code> <code>request.GET.get(</code><code>'Email'</code><code>)</code>
<code>q </code><code>=</code> <code>request.GET.get(</code><code>'group'</code><code>)</code>
擷取用戶端浏覽器中url位址裡面Email和group對應的值。
<code>if</code> <code>p:</code>
<code> </code><code>users </code><code>=</code> <code>User.objects.</code><code>filter</code><code>(Email</code><code>=</code><code>p)</code>
<code>if</code> <code>q:</code>
<code> </code><code>users </code><code>=</code> <code>User.objects.</code><code>filter</code><code>(group__Name__icontains</code><code>=</code><code>q)</code>
然後通過filter方法進行過濾。
<code>user </code><code>=</code> <code>User.objects.</code><code>filter</code><code>(Email</code><code>=</code><code>"[email protected]"</code><code>)</code>
擷取Email為[email protected]的對象。
如果是多對多關系的屬性,需要這樣寫
<code>users </code><code>=</code> <code>User.objects.</code><code>filter</code><code>(group__Name__icontains</code><code>=</code><code>q)</code>
group__Name(中間是雙下劃線)表示user表中group字段的屬性連結到對應的Group表中的Name字段上。
如果想模糊查詢,可以使用icontains方法。Name後面是雙下劃線"_"
<code>group__Name__icontains</code>
7、查詢郵箱為“[email protected]”的對象
<a href="https://s4.51cto.com/wyfs02/M00/8E/39/wKiom1i5BoXCOPL9AABu0zR72yI042.png" target="_blank"></a>
8、查詢所屬組的組名中帶有“CO”的
<a href="https://s5.51cto.com/wyfs02/M00/8E/39/wKiom1i5Bwai2BQDAACJ6hDu8gM638.png" target="_blank"></a>
9、組合查詢
查詢所屬組為COO,郵箱為[email protected]的對象
<a href="https://s3.51cto.com/wyfs02/M00/8E/39/wKiom1i5C-vyKfq_AABymzyC_6U413.png-wh_500x0-wm_3-wmp_4-s_123460478.png" target="_blank"></a>
補充:
1、 QuerySet 查詢結果排序
<code>User.objects.</code><code>all</code><code>().order_by(</code><code>'Name'</code><code>)</code>
<code>User.objects.</code><code>all</code><code>().order_by(</code><code>'-Name'</code><code>) </code><code>##在字段名前面加“-”,表示實作倒叙</code>
這裡我修改了表中使用者的姓名,如圖
<a href="https://s2.51cto.com/wyfs02/M02/8E/3A/wKiom1i5EOPj7WVnAADKMF7Oa34131.png-wh_500x0-wm_3-wmp_4-s_2625198831.png" target="_blank"></a>
修改api/views.py代碼
<a href="https://s3.51cto.com/wyfs02/M01/8E/3A/wKiom1i5ERPizS0GAAP5WE0i9ZY907.png-wh_500x0-wm_3-wmp_4-s_2873364406.png" target="_blank"></a>
再次通路api
<a href="https://s1.51cto.com/wyfs02/M01/8E/37/wKioL1i5EUei_qR8AADCfXKMcqc816.png-wh_500x0-wm_3-wmp_4-s_1698845626.png" target="_blank"></a>
2、排除符合條件的對象
<code>User.objects.</code><code>all</code><code>().order_by(</code><code>'Name'</code><code>).exclude(Name</code><code>=</code><code>'www'</code><code>)</code>
找出所有對象,但排除Name為‘www’的對象
通路api
修改api/views.py後再次通路,發現www這個使用者在頁面上不顯示了
<a href="https://s4.51cto.com/wyfs02/M01/8E/38/wKioL1i5GEKwOsL5AAQwgrbqdvw063.png-wh_500x0-wm_3-wmp_4-s_3862019719.png" target="_blank"></a>
<a href="https://s1.51cto.com/wyfs02/M02/8E/3A/wKiom1i5GEKCXFzXAACrXd232tY654.png-wh_500x0-wm_3-wmp_4-s_3843245736.png" target="_blank"></a>
本文轉自 曾哥最愛 51CTO部落格,原文連結:http://blog.51cto.com/zengestudy/1902980,如需轉載請自行聯系原作者