天天看點

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

<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,如需轉載請自行聯系原作者