博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
django 将表数据通过API展示到页面上
阅读量:7092 次
发布时间:2019-06-28

本文共 3932 字,大约阅读时间需要 13 分钟。

需求:

我在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
()])

表中的数据如下

我希望访问一个url获取到user表中的数据,像这样:

这种需求非常常见,比如公司有CMDB,我可以通过API去获取某个表里面的数据,然后去添加监控什么的。

下面是具体的操作方法:

1、新建一个名为api的APP,并加入到settings.py文件中的INSTALLED_APPS中

1
django-admin startapp api

2、在api这个app下,创建urls.py文件,并在mysite/usrls.py文件中include app/urls.py文件

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
)

获取表中所有对象

1
users 
= 
User.objects.
all
()

注意:由于User表中有多个对象,所以用User.objects.all()获取到的是一个对象的集合,即列表。

这个集合是可以迭代的,可以用以下代码,在按照自己的需求,展示数据

1
2
3
4
5
6
7
8
9
10
def 
get_user(request):
for 
user 
in 
users:
    
user_list 
= 
[]
    
users 
= 
User.objects.
all
()
    
user_list.append({
        
u
'姓名'
: user.Name,
        
u
'邮箱'
: user.Email,
        
u
'所属组'
','
.join([i.Name 
for 
in 
user.group.
all
()])
        
})
    
return 
JsonResponse(user_list,safe
=
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、访问api,获取user表中的数据

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”的对象

8、查询所属组的组名中带有“CO”的

9、组合查询

查询所属组为COO,邮箱为a@qq.com的对象

补充:

1、 QuerySet 查询结果排序

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

这里我修改了表中用户的姓名,如图

修改api/views.py代码

再次访问api

2、排除符合条件的对象

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

找出所有对象,但排除Name为‘www’的对象

访问api

修改api/views.py后再次访问,发现www这个用户在页面上不显示了

本文转自 曾哥最爱 51CTO博客,原文链接:http://blog.51cto.com/zengestudy/1902980,如需转载请自行联系原作者
你可能感兴趣的文章
String去掉后面空格
查看>>
Linux常用命令(1)
查看>>
linux命令
查看>>
Adobe吸引世界目光 数字出版让生活更精彩——软盛携Adobe DPS闪耀2013中国武汉期刊交易博览会...
查看>>
程序员之路
查看>>
Windows Server 2012 Hyper-V新特性(10)
查看>>
不指定文件类型日志
查看>>
4. 抽象方法
查看>>
convert time-24小时制转换为12小时制
查看>>
MISP2:初始阶段
查看>>
在Linux下创建空文件的方法
查看>>
项目整体管理
查看>>
打算搭建一个***视频下载网站
查看>>
Skype for Business Server 2015-04-前端服务器-7-部署
查看>>
我的友情链接
查看>>
django使用rest_framework API认证
查看>>
背景图片百分之百大小css设置方法
查看>>
SQL 语句中的With(index())
查看>>
我的友情链接
查看>>
修改计算机名后arcgis设置
查看>>