Django网络应用开发的5项基础核心技术包括模型(Model)的设计,URL 的设计与配置,View(视图)的编写,Template(模板)的设计和Form(表单)的使用。
在实现加载之前,需要了解加载有哪几种类型,最常见的就是分页加载、滚动加载、点击加载更多、上拉刷新和下拉加载。前端需要实现这些功能,往往需要数据最好是 json 格式,所以后端从数据库序列化数据。
① 序列化
ModelSerializer 类提供了一个快捷方式,可以基于 Models 自动创建一个 Serializer 类,其中的字段与模型类字段对应。
ModelSerializer 类与常规 Serializer 类相同,不同之处在于:
class NewsCategorySerializer(serializers.ModelSerializer):
class Meta:
model = NewsCategory
fields = ('id', 'name')
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('id', 'username', 'telephone', 'email', 'date_joined', 'is_staff', 'is_active')
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。
from django.views.decorators.http import require_GET
另外还是以下几种限制 HTTP 请求方法的装饰器。
@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)
start = settings.ONE_PAGE_NEWS_COUNT * (page-1)
end = start + settings.ONE_PAGE_NEWS_COUNT
start 和 end 是切片的取值范围,settings.ONE_PAGE_NEWS_COUNT 是在项目的 settings.py 文件配置了切片的数值。
③ 搜索
from django.db.models import Q
Q 对象 (django.db.models.Q) 可以对关键字参数进行封装,从而更好地应用多个查询。可以组合使用 &(and),|(or),~(not)操作符,当一个操作符是用于两个Q的对象,它产生一个新的Q对象。
Q对象可以与关键字参数查询一起使用,不过一定要把Q对象放在关键字参数查询的前面。
newses = News.objects.filter(Q(title__icontains=q) | Q(content__icontains=q))
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)