首页>>后端>>Python->django中queryset是什么

django中queryset是什么

时间:2023-12-25 本站 点击:0

导读:很多朋友问到关于django中queryset是什么的相关问题,本文首席CTO笔记就来为大家做个详细解答,供大家参考,希望对大家有所帮助!一起来看看吧!

Django的orm中get和filter的不同

get得到的是一个model对象,filter得到的是一组model对象,类型是queryset,是一个django定义的,可迭代的,可以当作是一个list操作,每个索引都是一个model对象。 get如果满足的条件大于一个的时候,会报错 #有点类似于如下: get相当与fetchon.

Django 如何定位到queryset的某一行

什么叫queryset的某一行,queryset本身是一个迭代生成器,如果你要具体到第几行,用类似分片的写法就行了,实际系统会生成查固定行数是sql

如何有效的遍历django的QuerySet

最近做了一个小的需求,在django模型中通过前台页面的表单的提交(post),后台对post的参数进行解析,通过models模型查询MySQL,将数据结构进行加工,返回到前台页面进行展示。由于对django中QuerySet特性的不熟悉,所以测试过程中发现了很多问题。

开始的阶段没有遇到什么问题,我们举例,在models有一张员工表employee,对应的表结构中,postion列表示员工职位,前台post过来的参数赋给position,加上入职时间、离职时间,查询操作通过models.filter(position=params)完成,获取的员工信息内容由QuerySet和当前展示页与每页展示的记录数进行简单的计算,返回给前台页面进行渲染展示。编码如下:

复制代码

1 def get_employees(position, start, end):

2 return employee.objects.filter(alert_time__lt=end,alert_time__gt=start).filter(position__in=position)

3

4

5 @login_required

6 def show(request):

7 if not validate(request):

8 return render_to_response('none.html',

9 context_instance=RequestContext(request, 'msg':'params error')

10 )

11

12 position = request.REQUEST.get('position')

13 time_range = request.REQUEST.get('time')

14 start, end = time_range[0], time_range[1]

15

16 num_per_page, page_num = get_num(request)

17 all_employees = get_employees(position, start, end)

18 # 根据当前页与每页展示的记录数,取到正确的记录

19 employees = employees_events[(page_num-1)*num_per_page:page_num*num_per_page]

20

21 return render_to_response('show_employees.html',

22 context_instance=RequestContext(

23 request,

24 'employees': employees,

25 'num_per_page': num_per_page,

26 'page_num':page_num,

27 'page_options' : [50, 100, 200]

28 )

29 )

复制代码

运行之后可以正确的对所查询的员工信息进行展示,并且查询速度很快。employee表中存放着不同职位的员工信息,不同类型的详细内容也不相同,假设employees有一列名为infomation,存储的是员工的详细信息,infomation = {'age': 33, 'gender': 'male', 'nationality': 'German', 'degree': 'doctor', 'motto': 'just do it'},现在的需求是要展示出分类更细的员工信息,前台页面除了post职位、入职离职时间外,还会对infomation中的内容进行筛选,这里以查询中国籍的设计师为例,在之前的代码基础上,需要做一些修改。员工信息表employee存放于MySQL中,而MySQL为ORM数据库,它并未提供类似mongodb一样更为强大的聚合函数,所以这里不能通过objects提供的方法进行filter,一次性将所需的数据获取出来,那么需要对type进行过滤后的数据,进行二次遍历,通过information来确定当前记录是否需要返回展示,在展示过程中,需要根据num_per_page和page_num计算出需要展示数据起始以及终止位置。

django如何在queryset外面包一层json,添加result_code

queryset只是结果集,需要将它序列化成可以展示的数据,然后将数据放在HTTP响应中返回。此时可以指定响应的状态码。

写一个例子:

模型为MyModel,其中有字段name,需要返回所有name的列表。

from django.http import JsonResponse

queryset = MyModel.objects.all()

name_list = [instance.name for instance in queryset]

response = JsonResponse(data=name_list, status=201) # 构造一个json响应,响应体为name_list,状态码为201

return response # 返回此响应

问一个django中queryset的问题

from itertools import chain

from operator import attrgetter

#...

post = Post.objects.get(pk=post_id)  # 获取博文

likes = likes = post.like_set.all()  # 获取喜爱信息

# likes = Like.objects.filter(post=post)

reblogs = Post.objects.filter(reblog_from=post)  # 获取转发信息

# 合并喜爱及转发信息,并按时间逆序排序

notes = sorted(chain(likes, reblogs), key=attrgetter('created_at'),

               reverse=True)

#...

使用 itertools.chain 函数合并可迭代对象,查询集为可迭代对象:

list(chain([1,2,3],'abc'))[1,2,3,'a','b','c']

使用 sorted 函数排序(按对象属性排序)。

结语:以上就是首席CTO笔记为大家介绍的关于django中queryset是什么的全部内容了,希望对大家有所帮助,如果你还想了解更多这方面的信息,记得收藏关注本站。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:/Python/59783.html