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