您好,登錄后才能下訂單哦!
需求:
我在learn這個app下創建了兩張表,其中一個表為user,我希望通過API,在頁面是展示這些數據,當用戶訪問指定的url時,將表中所有對象展示到頁面上。
先看learn/models.py文件代碼
#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 i 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 i in self.group.all()])
表中的數據如下
我希望訪問一個url獲取到user表中的數據,像這樣:
這種需求非常常見,比如公司有CMDB,我可以通過API去獲取某個表里面的數據,然后去添加監控什么的。
下面是具體的操作方法:
1、新建一個名為api的APP,并加入到settings.py文件中的INSTALLED_APPS中
django-admin startapp api
2、在api這個app下,創建urls.py文件,并在mysite/usrls.py文件中include app/urls.py文件
3、編輯api/views.py文件。創建一個函數,用來響應來自urls.py中定義的url的請求
#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): p = request.GET.get('Email') q = 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 i in user.group.all()]) }) return JsonResponse(user_list,safe=False)
獲取表中所有對象,
users = User.objects.all()
注意:由于User表中有多個對象,所以用User.objects.all()獲取到的是一個對象的集合,即列表。
這個集合是可以迭代的,可以用以下代碼,在按照自己的需求,展示數據
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 i in user.group.all()]) }) return JsonResponse(user_list,safe=False)
4、編輯api/urls.py文件,
#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表中所有的對象,我們可以查詢指定的對象,并展示
#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): p = request.GET.get('Email') q = 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 i in user.group.all()]) }) return JsonResponse(user_list,safe=False)
p = request.GET.get('Email') q = request.GET.get('group')
獲取客戶端瀏覽器中url地址里面Email和group對應的值。
if p: users = User.objects.filter(Email=p) if q: users = User.objects.filter(group__Name__icontains=q)
然后通過filter方法進行過濾。
user = User.objects.filter(Email="abc@qq.com")
獲取Email為abc@qq.com的對象。
如果是多對多關系的屬性,需要這樣寫
users = User.objects.filter(group__Name__icontains=q)
group__Name(中間是雙下劃線)表示user表中group字段的屬性鏈接到對應的Group表中的Name字段上。
如果想模糊查詢,可以使用icontains方法。Name后面是雙下劃線"_"
group__Name__icontains
7、查詢郵箱為“a@qq.com”的對象
8、查詢所屬組的組名中帶有“CO”的
9、組合查詢
查詢所屬組為COO,郵箱為a@qq.com的對象
補充:
1、 QuerySet 查詢結果排序
User.objects.all().order_by('Name') User.objects.all().order_by('-Name') ##在字段名前面加“-”,表示實現倒敘
這里我修改了表中用戶的姓名,如圖
修改api/views.py代碼
再次訪問api
2、排除符合條件的對象
User.objects.all().order_by('Name').exclude(Name='www')
找出所有對象,但排除Name為‘www’的對象
訪問api
修改api/views.py后再次訪問,發現www這個用戶在頁面上不顯示了
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。