字段参数之choices(重要)
用户表
性别字段
学历字段
在职状态
...
"""如果我们在设计表字段的时候 有一些字段能够完全列举出所有可能的情况"""
# 这个时候推荐使用choices参数
class User(models.Model):
name = models.CharField(max_length=32)
age = models.IntegerField()
gender_choices = (
(1, '男性'),
(2, '女性'),
(3, '其他')
)
gender = models.IntegerField(choices=gender_choices)
user_obj = models.User.objects.filter(pk=1).first()
user_obj.gender # 1
user_obj.get_gender_display() # 男性
'''如果没有对应关系则返回数据本身'''
多对多三种表关系
# 第一种:全自动
"""
优点在于不需要我们编写第三张关系表代码
缺点在于第三张关系表字段固定死了无法扩展
"""
authors = models.ManyToManyField(to='Author')
# 第二种:纯手动
"""
优点在于第三张表可以无限制的扩展字段
缺点在于需要自己手动编写 并且涉及到ORM正反向查询的时候不方便
"""
class Book(models.Model):
pass
class Author(models.Model):
pass
class Book2Author(models.Model):
book_id = models.ForeignKey(to='Book')
author_id = models.ForeignKey(to='Author')
bond_time = models.DateField(auto_now=True)
# 第三种:半自动
class Book(models.Model):
authors = models.ManyToManyField(
to='Author',
through='Book2Author' # 告诉orm第三张关系表是谁不要自动创
through_fields=('book_id','author_id') # 通过哪两个字段
)
class Author(models.Model):
# 多对多外键字段在orm中可以建在任意一张管理表中
books = models.ManyToManyField(
to='Book',
through='Book2Author' # 告诉orm第三张关系表是谁不要自动创
through_fields=('author_id','book_id') # 通过哪两个字段
)
class Book2Author(models.Model):
book_id = models.ForeignKey(to='Book')
author_id = models.ForeignKey(to='Author')
bond_time = models.DateField(auto_now=True)
MTV与MVC模型理论
MTV模型
M:models模型层
T:template模板层
V:views视图层
MVC模型
M:models模型层
V:views视图层
C:controllar控制层(urls.py...)
"""
django自称为MTV模型 其实本质也还是MVC模型
大部分的web框架都属于MVC
"""
ajax语法
# 特征:异步提交 局部刷新
"""
可以发送网络请求的标签
a标签 GET请求
form表单 GET请求 POST请求
ajax技术 GET请求 POST请求
"""
# ajax并不是一门新的技术 而是有js代码演变而来 相当于我们python基础所学的装饰器(名称空间 函数对象 闭包函数)
# 我们学习jQuery封装之后的ajax代码(格式固定 并且语法简单 好记)
# 以后我们可能还会遇到使用其他框架封装的ajax技术
AJAX 最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容。(这一特点给用户的感受是在不知不觉中完成请求和响应过程)
"""使用jQuery封装的ajax一定要记得先引入ajax资源"""
# 基本语法格式
$.ajax({
url:'', // 朝哪个后端地址发送请求(不写 后缀 全路径)
type:'post', // 指定请求的方式(get post)
data:{'username':'jason','pwd':123}, // 请求携带的数据
success:function (args) {
// 异步回调机制(后端返回数据之后自动触发的操作)}
})
content-Type参数
content-Type相当于说明了数据的组织格式
后端通过该参数就可以提前明确数据格式之后采取对应的处理措施操作数据
ajax默认的数据格式为urlencoded
该格式数据:i1=123213&i2=12313
针对该类型的数据:django会自动处理到request.POST中
form表单默认的数据格式也是urlencoded
该格式数据:i1=123213&i2=12313
针对该类型的数据:django会自动处理到request.POST中
form表单还可以发送数据格式为formdata
该格式数据无法查看到
针对该类型的数据:普通的数据还是解析到request.POST中 文件类型的数据解析到request.FILES中
ajax发送json格式数据
"""
python中序列化反序列化
import json
json.dumps()
json.loads()
Js中序列化反序列化
JSON.stringify()
JSON.parse()
"""
# 言行一致
$.ajax({
url:'',
type:'post', // 不写该参数 默认也是get请求
data:JSON.stringify({'username':'jason','pwd':123}),
contentType:'application/json',
success:function (args) {
alert(args)
}
})
def ab_ajax(request):
if request.method == 'POST':
# print(request.POST)
# i1 = request.POST.get('i1')
# i2 = request.POST.get('i2')
# res = int(i1) + int(i2)
# print(request.POST)
# print(request.FILES)
# print(request.GET)
print(request.body) # 原生的数据格式(bytes类型)
json_bytes = request.body
# json_str = json_bytes.decode('utf8')
import json
# json_dict = json.loads(json_str)
json_dict = json.loads(json_bytes)
print(json_dict,type(json_dict))
return HttpResponse(123)
return render(request,'ab_ajax.html')
ajax如何发送文件数据
$('#b1').click(function () {
// ajax发送携带文件数据的请求 需要借助于内置对象FormData
// 1.先生成一个FormData对象
let formDataObj = new FormData();
// 2.往该对象中添加数据(支持普通数据和文件数据)
formDataObj.append('name',$('#i2').val());
formDataObj.append('pwd',$('#i3').val());
// 获取文件数据 有固定的语法格式
formDataObj.append('file',$('#i1')[0].files[0]);
// 发送ajax请求
$.ajax({
url:"/ab_file/",
type:'post',
// 发送文件需要额外配置的两个参数
contentType:false,
processData: false,
data:formDataObj,
success:function () {
}
})
})
dataType参数
"""前后端交互 如果采用的是ajax 那么后端的返回值应该使用字典(json格式)"""
当后端采用HttpResponse返回json格式数据到ajax异步回调函数默认情况下需要我们自己做反序列化JSON.parse如果不想自己处理可以添加dataType:"JSON"
如果后端是采用JsonResponse返回json格式数据则无需我们自己处理也不需要添加
dataType:"JSON"参数(加了也不影响)
# 以后推荐加上 增加程序兼容性
序列化模块
from django.core import serializers
def ab_ser(request):
data = models.Books.objects.all()
# new_list = []
# for obj in data: # 数据对象
# temp_dict = {}
# temp_dict['table'] = 'app01.Books'
# temp_dict['pk'] = obj.pk
# temp_dict['title'] = obj.title
# temp_dict['price'] = obj.price
# temp_dict['publish_name'] = obj.publish_name
# new_list.append(temp_dict)
# return JsonResponse(new_list, safe=False)
# 调用该模块下的方法,第一个参数是你想以什么样的方式序列化你的数据
ret = serializers.serialize('json', data) # DRF的前身
return HttpResponse(ret)
批量插入数据
def ab_bc(request):
# 循环创建十万本书籍数据
# for i in range(100000): # 不推荐此法 效率极低
# models.Book.objects.create(title='第%s本书'%i)
# new_obj_list = []
# for i in range(100000):
# 仅仅是用类产生了对象 并没有操作数据库
# book_obj = models.Book(title='第%s本新的书'%i)
'''上述代码 如果对象很多的情况下 比较浪费空间'''
new_obj_iter = (models.Book(title='第%s本新的书'%i) for i in range(100000))
# 批量插入
models.Book.objects.bulk_create(new_obj_iter)
data_queryset = models.Book.objects.all()
return render(request,'ab_bc.html',locals())