• 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()])

    表中的数据如下

    wKioL1i4-rHiIVSiAAEERSN7H64451.png

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

    wKiom1i4-ziilixjAACMapeuEss147.png

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

    下面是具体的操作方法:

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

    1
    django-admin startapp api

    wKiom1i4_R2x717zAAXKtJG9GD4190.png-wh_50

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

    wKioL1i4_b7wYJBJAAKEHcJnMLU423.png

    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)

    获取表中所有对象

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

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

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

    import requests
    
    res = requests.get('http://127.0.0.1:8000/api/get_user/')
    print(res.json())
    
    输出:[{'年龄': '18', '邮箱': '123@qq.com', '姓名': '王腾'}, {'年龄': '23', '邮箱': '23@qq.com', '姓名': '微软'},
    {'年龄': '34', '邮箱': '23@qq.com', '姓名': '天赋'}]

    5-2、在网页访问api,获取user表中的数据

    wKiom1i4-ziilixjAACMapeuEss147.png

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

    wKiom1i5BoXCOPL9AABu0zR72yI042.png

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

    wKiom1i5Bwai2BQDAACJ6hDu8gM638.png

    9、组合查询

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

    wKiom1i5C-vyKfq_AABymzyC_6U413.png-wh_50

    补充:

    1、 QuerySet 查询结果排序

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

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

    wKiom1i5EOPj7WVnAADKMF7Oa34131.png-wh_50

    修改api/views.py代码

    wKiom1i5ERPizS0GAAP5WE0i9ZY907.png-wh_50

    再次访问api

    wKioL1i5EUei_qR8AADCfXKMcqc816.png-wh_50

    2、排除符合条件的对象

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

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

    wKiom1i5Fy6RYuNyAAEDecvcDGs211.png

    访问api

    wKioL1i5F3-waunEAADVtxP3mkI806.png-wh_50

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

    wKioL1i5GEKwOsL5AAQwgrbqdvw063.png-wh_50

    wKiom1i5GEKCXFzXAACrXd232tY654.png-wh_50

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

  • 相关阅读:
    作业8: 软件工程学习总结
    用户体验——南通大学教务学生管理系统
    “构建之法互动游戏”感想
    第二次作业
    音乐播放器的发展演变
    C++用法的学习心得
    一、最后一次作业:软件工程学习总结
    设计一款给爸爸妈妈用的手机
    附加题1—— 我想搞懂的软工问题
    计算机病毒软件的发展演变
  • 原文地址:https://www.cnblogs.com/wt11/p/6537043.html
Copyright © 2020-2023  润新知