天天看点

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,如需转载请自行联系原作者