django 将表数据通过API展示到页面上(转)

Posted 明天OoO你好

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
#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="[email protected]")

获取Email为[email protected]的对象。

如果是多对多关系的属性,需要这样写

1
users = User.objects.filter(group__Name__icontains=q)

group__Name(中间是双下划线)表示user表中group字段的属性链接到对应的Group表中的Name字段上。

 

如果想模糊查询,可以使用icontains方法。Name后面是双下划线"_"

1
group__Name__icontains

 

7、查询邮箱为“[email protected]”的对象

技术分享

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

技术分享

 

9、组合查询

查询所属组为COO,邮箱为[email protected]的对象

技术分享

 

 

补充:

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这个用户在页面上不显示了

技术分享

技术分享

 请务必保留此出处http://zengestudy.blog.51cto.com/1702365/1902980

以上是关于django 将表数据通过API展示到页面上(转)的主要内容,如果未能解决你的问题,请参考以下文章

Django中的Admin站点

Django 怎样传数据给HTML页面的ajax

django drf_yasg 非restful风格的api怎么在swagger上展示?

Django实现自定义template页面并在admin site的app模块中加入自定义跳转链接

django中web页面的跳转方式

Django 预加载 Yelp API 结果