需求:

我在learn这个app下创建了两张表,其中一个表为user,我希望通过API,在页面是展示这些数据,当用户访问指定的url时,将表中所有对象展示到页面上。

先看learn/models.py文件代码

#coding:utf8fromdjango.dbimportmodelsclassGroup(models.Model):Name=models.CharField(max_length=20)defuser_list(self):return','.join([i.Nameforiinself.user_set.all()])def__unicode__(self):returnself.NameclassUser(models.Model):Name=models.CharField(max_length=20)Email=models.CharField(max_length=50)group=models.ManyToManyField(Group,blank=True)def__unicode__(self):returnself.Namedefgroup_list(self):return','.join([i.Nameforiinself.group.all()])


表中的数据如下


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

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


下面是具体的操作方法:

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

django-adminstartappapi



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



3、编辑api/views.py文件。创建一个函数,用来响应来自urls.py中定义的url的请求

#coding:utf8fromdjango.httpimportHttpResponse,JsonResponsefromdjango.shortcutsimportrenderfromlearn.modelsimport*##别忘了从learn/models.py文件中导入User对象#Createyourviewshere.defget_user(request):p=request.GET.get('Email')q=request.GET.get('group')user_list=[]users=User.objects.all()ifp:users=User.objects.filter(Email=p)ifq:users=User.objects.filter(group__Name__icontains=q)foruserinusers:user_list.append({u'姓名':user.Name,u'邮箱':user.Email,u'所属组':','.join([i.Nameforiinuser.group.all()])})returnJsonResponse(user_list,safe=False)

获取表中所有对象,

users=User.objects.all()

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

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

defget_user(request):foruserinusers:user_list=[]users=User.objects.all()user_list.append({u'姓名':user.Name,u'邮箱':user.Email,u'所属组':','.join([i.Nameforiinuser.group.all()])})returnJsonResponse(user_list,safe=False)


4、编辑api/urls.py文件,

#coding:utf8fromdjango.conf.urlsimporturlfromdjango.contribimportadminfromapi.viewsimport*urlpatterns=[url(r'^get_user/',get_user),]


5、访问api,获取user表中的数据



6、获取指定的用户的信息

上面的api展示的user表中所有的对象,我们可以查询指定的对象,并展示

#coding:utf8fromdjango.httpimportHttpResponse,JsonResponsefromdjango.shortcutsimportrenderfromlearn.modelsimport*##别忘了从learn/models.py文件中导入User对象#Createyourviewshere.defget_user(request):p=request.GET.get('Email')q=request.GET.get('group')user_list=[]users=User.objects.all()ifp:users=users.objects.filter(Email=p)ifq:users=users.objects.filter(group__Name__icontains=q)foruserinusers:user_list.append({u'姓名':user.Name,u'邮箱':user.Email,u'所属组':','.join([i.Nameforiinuser.group.all()])})returnJsonResponse(user_list,safe=False)

p=request.GET.get('Email')q=request.GET.get('group')

获取客户端浏览器中url地址里面Email和group对应的值。

ifp:users=User.objects.filter(Email=p)ifq: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这个用户在页面上不显示了