模型层补充
MTV与MVC模型
MTV 全称 Models Templates Views 模型模板视图
MVC 全称 Models Views Controller 模型视图控制
choices参数(数据库字段设计常见)
choices使用
class User(models.Model):
username = models.CharField(max_length=32)
age = models.IntegerField()
作用: 针对可以被预测到结果的字段对应的数据, 那么可以为该字段定制choices参数, 取数据的时候就可以通过`对象.get_设置choices的字段_display()`获取到定制的数据.
例如: 性别 学历 工作经验 是否结婚 是否生子 客户来源等等. 针对某个可以列举完全的可能性字段我们用choices存储.
2. 存: 指定对设置了choices的字段存数据
数据存得时候没有列举出来的数字也能存. 范围还是按照字段类型决定
3. 取: 指定对设置了choices的字段取数据.
方法: 对象.get_设置choices的字段_display()
如果取得时候如果没有对应关系 那么字段是什么还是展示什么
gender = models.IntegerField(choices=gender_choices)
score = models.CharField(choices=score_choices, null=True)
user_obj1 = models.User.objects.create(username='jason', age=18, gender=1)
models.User.objects.create(username='egon', age=85, gender=2)
models.User.objects.create(username='tank', age=40, gender=3)
user_obj4 = models.User.objects.create(username='tony', age=45, gender=4)
print(user_obj1.get_gender_display())
print(user_obj4.get_gender_display())

多对多三种创建方式
1. 全自动
2. 可以使用ORM提供的多对多关系表之间的增删改查清空方法remove,add,set,clear和正反向+双下划线查询
缺点: 可扩展性极差. 无法对ORM自动生成的第三种虚拟中间表进行增添字段的操作
class Book(models.Model):
name = models.CharField(max_length=32)
book = models.ManyToManyField(to='Author')
class Author(models.Model):
name = models.CharField(max_length=32)
2. 纯手动
缺点: 需要书写的代码量大. 并且ORM提供的多对多关系的增删改查清空方法, 以及正反向+双下划线查询都不支持一律都不能使用.
class Book(models.Model):
name = models.CharField(max_length=32)
class Author(models.Model):
name = models.CharField(max_length=32)
class Book2Author(models.Model):
book = models.ForeignKey(to='Book')
author = models.ForeignKey(to='Author')
3. 半自动
优点: 既可以对第三张表进行格外增添字段的操作, 又能使用ORM提供的正反向+双下划线查询
缺点: 不能使用ORM提供的多对多表关系增删改清空方法. add, set, remove, clear
to: 需要建立多对多外键关系的表. 本来需要指定to_field, 但是默认关联的就是被关联表的主键, 因此不需要指定.
通过第三张表反向查对应建立多对多外键关联的表需要用到的哪个字段 哪个字段就放在前面
简化: 谁是建立多对多外键关联的表, 就把对应的关联字段放前面
class Book(models.Model):
name = models.CharField(max_length=32)
authors = models.ManyToManyField(
through_fields=('book', 'author'))
class Author(models.Model):
name = models.CharField(max_length=32)
class Book2Author(models.Model):
book = models.ForeignKey(to='Book')
author = models.ForeignKey(to='Author')
Ajax
Ajax简介
1. 简介
AJAX 全称 Asynchronous JavaScript and XML 异步JavaScript和XML
动态获取用户名实时的跟后端确认并实时展示的前端(局部刷新)
1. AJAX 不是新的编程语言,而是一种使用现有标准的新方法(比较装饰器)
2. AJAX 最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容。(这一特点给用户的感受是在不知不觉中完成请求和响应过程)
3. 注意: Ajax我们只争对jQuery封装之后的版本(原生的复杂并且在实际项目中也一般不用)
补充: 并不只有jQuery能够实现ajax,其他的框架也可以 但是换汤不换药 原理是一样的
2. 前端朝后端发送请求的方式
3. form表单(:submit 和 button) GET请求/POST请求
Ajax常见应用情景
2. 在前两个框中输入数字 点击按钮 朝后端发送ajax请求
3. 后端计算出结果 再返回给前端动态展示的到第三个input框中
1. 前端: templates下的ab_ajax.html
<input type="text" id="d1"> +
<input type="text" id="d2"> =
<input type="text" id="d3">
$(".btn").click(function () {
type: 'post', // 不指定默认就是get 都是小写
data: {'d1': $("#d1").val(), 'd2': $("#d2").val()},
// 4.自动将接收到后端的string类型的json格式, 反序列化转换成对象. 如果后端指定使用JsonResponse返回数据. 那么就无需指定.
// 5.回调函数:当后端给你返回结果的时候会自动触发 args接受后端的返回结果
success: function (args) {
// 6. 通过DOM操作动态渲染到第三个input里面
console.log(typeof args);
2. 后端: views.py
Failed to load resource: the server responded with a status of 403 (Forbidden)
if request.method == "POST":
d1 = request.POST.get('d1')
d2 = request.POST.get('d2')
username = {'username': 'jason', 'password': '123'}
return HttpResponse(json.dumps(username))
from django.http import JsonResponse
username = {'username': 'jason', 'password': '123'}
return JsonResponse(username)
return render(request, 'ab_ajax.html')
前后端传输数据的编码格式(contentType)
get请求数据就是直接放在url?号后面的每个参数之间用&符连接, 如下:
url?username=jason&password=123
数据格式: username=jason&password=123
结论: django后端针对符合urlencoded编码格式的数据都会自动帮你解析封装到request.POST中. 如下所示:
username=jason&password=123 >>> request.POST
!!!注意!!!: 我们这里指的是符合. 如果你指定的是form-data编码格式, 针对普通的键值对还是解析到request.POST中, 而文件将会解析到request.FILES中
数据格式: username=jason&password=123
结论: django后端针对符合urlencoded编码格式的数据都会自动帮你解析封装到request.POST中. 如下所示:
username=jason&age=20 >>> request.POST
Ajax发送json格式数据
1. 前端页面ajax中指定参数(注意: 都是基于post请求方式提交数据)
1.1 指定数据编码格式: contentType: application/json
1.2 对发送给后端的数据进行序列化: data: JSON.stringify({'username': 'egon', 'age': 18})
2.1 json格式的数据django后端不会不会做任何的处理. 需要我们手动 通过request.body获取二进制格式的json数据
2.2 后端有2种方式将这种格式反解成python数据类型
第一种: 先使用decode解码成str类型. 再使用json.loads反序列化成python数据类型
$('#d1').click(function () {
data:JSON.stringify({'username':'jason','age':25}),
contentType:'application/json', // 指定编码格式
json_bytes = request.body
json_str = json_bytes.decode('utf-8')
json_dict = json.loads(json_str)
print(json_dict, type(json_dict)) # {'username': 'jason', 'age': 25}
json_bytes = request.body
json_dict = json.loads(json_bytes) # {'username': 'jason', 'age': 25}
print(json_dict, type(json_dict)) # {'username': 'jason', 'age': 25}
return render(request, 'ab_json.html')
