前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Django实战-信息资讯-切片加载与搜索

Django实战-信息资讯-切片加载与搜索

作者头像
小团子
发布2019-07-18 16:42:09
7490
发布2019-07-18 16:42:09
举报
文章被收录于专栏:数据云团数据云团

Django网络应用开发的5项基础核心技术包括模型(Model)的设计,URL 的设计与配置,View(视图)的编写,Template(模板)的设计和Form(表单)的使用。

在实现加载之前,需要了解加载有哪几种类型,最常见的就是分页加载、滚动加载、点击加载更多、上拉刷新和下拉加载。前端需要实现这些功能,往往需要数据最好是 json 格式,所以后端从数据库序列化数据。

① 序列化

ModelSerializer 类提供了一个快捷方式,可以基于 Models 自动创建一个 Serializer 类,其中的字段与模型类字段对应。

ModelSerializer 类与常规 Serializer 类相同,不同之处在于:

  • 它会根据模型自动生成一组字段。
  • 它会自动为序列化类生成验证器,例如 unique_together 验证器。
  • 它包含 .create() 和 .update() 的简单默认实现。
代码语言:javascript
复制
class NewsCategorySerializer(serializers.ModelSerializer):
    class Meta:
        model = NewsCategory
        fields = ('id', 'name')
代码语言:javascript
复制
class UserSerializer(serializers.ModelSerializer):

    class Meta:
        model = User
        fields = ('id', 'username', 'telephone', 'email', 'date_joined', 'is_staff', 'is_active')
代码语言:javascript
复制
class NewsSerializer(serializers.ModelSerializer):
    # 重写 category
    category = NewsCategorySerializer()
    author = UserSerializer()
    # 指定模型 提取字段信息
    class Meta:
        model = News
        fields = ('id', 'title', 'desc', 'thumbnail', 'pub_time', 'category', 'author')

默认情况下,该类中的所有模型类字段将被映射为相应的序列化类字段。 任何关系(如模型上的外键)都将映射到 PrimaryKeyRelatedField 。除非在序列化关系文档中指定,否则默认不包括反向关系。

② 页面加载

django.views.decorators.http 里的装饰器可以基于请求的方法来限制对视图的访问。若条件不满足会返回 django.http.HttpResponseNotAllowed。

代码语言:javascript
复制
from django.views.decorators.http import require_GET

另外还是以下几种限制 HTTP 请求方法的装饰器。

  • require_GET() 只允许视图接受 GET 方法的装饰器。
  • require_POST() 只允许视图接受 POST 方法的装饰器。
  • require_safe() 只允许视图接受 GET 和 HEAD 方法的装饰器。 这些方法通常被认为是安全的。
代码语言:javascript
复制
@require_GET
def news_list(request):
    # /new/list/?p
    # 指定默认参数  1
    page = int(request.GET.get('p', 1))
    category_id = int(request.GET.get('category_id', 0))
    # offer,limit
    # 切片页面加载
    # News.objects.all()[0:10]
    # start = 0 * (page-1)
    start = settings.ONE_PAGE_NEWS_COUNT * (page-1)
    end = start + settings.ONE_PAGE_NEWS_COUNT
    # newses Queryset -> [NewsObject,News()]  对象 values()可以将Queryset 转换成列表
    # 并且将Queryset的模型对象(比如News()对象) 转换为字典 , 再转换成列表
    # newses = list(News.objects.all()[start:end].values())
    # print(type(newses))
    # 序列化表单字段
    if category_id == 0:
        # 如果category_id = 0 , 说明没有传category_id 过去
        newses = News.objects.all()[start:end]
        # 提取多条数据
    else:
        newses = News.objects.filter(category_id=category_id)[start:end]
    serizlizer = NewsSerializer(newses, many=True)
    return restful.result(data=serizlizer.data)
代码语言:javascript
复制
 start = settings.ONE_PAGE_NEWS_COUNT * (page-1)
 end = start + settings.ONE_PAGE_NEWS_COUNT

start 和 end 是切片的取值范围,settings.ONE_PAGE_NEWS_COUNT 是在项目的 settings.py 文件配置了切片的数值。

③ 搜索

代码语言:javascript
复制
from django.db.models import Q

Q 对象 (django.db.models.Q) 可以对关键字参数进行封装,从而更好地应用多个查询。可以组合使用 &(and),|(or),~(not)操作符,当一个操作符是用于两个Q的对象,它产生一个新的Q对象。

Q对象可以与关键字参数查询一起使用,不过一定要把Q对象放在关键字参数查询的前面。

代码语言:javascript
复制
newses = News.objects.filter(Q(title__icontains=q) | Q(content__icontains=q))
代码语言:javascript
复制
def search(request):
    q = request.GET.get('q')
    if q:
    # title 或者 content 中包含了搜索的关键字,那么就返回
        newses = News.objects.filter(Q(title__icontains=q) | Q(content__icontains=q))
        context = {
            'newses': newses
        }
    else:
        context = {}
    return render(request, 'news/search.html', context=context)
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-07-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据云团 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档