以一张信息表为例
性别 学历 工作经验 是否婚配 是否生子 客户来源 ...
针对某个可以列举完全的可能性字段,我们应该如何存储
只要某个字段的可能性时列举完全的,那么一般情况下都会采用choice参数
from random import choices
from django.db import models
# Create your models here.
class User(models.Model):
username = models.CharField(max_length=32)
age = models.IntegerField()
# 性别
gender_choices = (
(1, 'male'),
(2, 'female'),
(3, 'other'),
)
score = (
('1', 'male'),
('2', 'female'),
('3', 'other'),
)
# 保证字段类型跟列举出来的元祖第一个数据类型一致即可
gender = models.IntegerField(choices=gender_choices)
'''
该gender字段存的还是数字 但是如果存的数据在上面元祖列举的范围之内
那么可以非常轻松的获取到数字对应的真正内容
'''
gender字段存的数字不在上述元组列举的范围内会如何?
如果数字在,如何获取对应的中文注释
gender字段存的数字在上述元组列举的范围内
from django.test import TestCase
# !/usr/bin/env python
import os
import sys
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day08.settings")
import django
django.setup()
from app01 import models
models.User.objects.create(username="dream", age=18, gender=1)
models.User.objects.create(username="mengmeng", age=28, gender=2)
models.User.objects.create(username="chimeng", age=39, gender=3)
# 存的时候,没有列举出来的数字也能被存进去
models.User.objects.create(username="hope", age=44, gender=4)
没有报错,且第四条已经插入到数据库中
gender字段存的数字在上述元组列举的范围内并获取
# 取 - 如果有对应关系
user_obj = models.User.objects.filter(pk=1).first()
print(user_obj.gender) # 1
# 只要是 choice字段的注释,如果想要获取到注释的信息,固定写法 get_字段名_display()
print(user_obj.get_gender_display()) # male
gender字段存的数字不在上述元组列举的范围内
# 取 - 如果没有对应关系
user_obj = models.User.objects.filter(pk=4).first()
# 如果没有对应关系 字段是什么 返回的就是什么
print(user_obj.get_gender_display()) # 4
choice参数使用场景非常广泛
例如
MTV模型和MVC模型是两种常见的软件设计模式,用于组织和管理用户界面和应用程序的逻辑
虽然它们存在一些相似之处,但它们在设计和应用上有一些不同
MTV模型是指Model-Template-View(模型-模板-视图)模型,是Django框架中采用的一种设计模式。它的核心思想是将应用程序分为三个主要部分:
模型(Model):
模板(Template):
视图(View):
MTV模型的优点在于它可以很好地将应用程序的逻辑和用户界面进行分离,使代码更容易维护和扩展。
MVC模型是指Model-View-Controller(模型-视图-控制器)模型,是一种常见的软件设计模式,广泛应用于Web开发和其他应用程序中。
模型(Model):
视图(View):
控制器(Controller):
MVC模型的优点在于它可以很好地分离应用程序的不同组件,使得代码更易于维护、测试和重用。
利用ORM自动帮我们创建第三张表关系
class Book(models.Model):
name = models.CharField(max_length=32)
# 全自动
authors = models.ManyToManyField(to='Author')
class Author(models.Model):
name = models.CharField(max_length=32)
优点:代码不需要自己写,非常方便,还支持ORM提供操作第三张表的方法
缺点:第三张表的扩展性极差(没办法添加额外字段)
class Book(models.Model):
name = models.CharField(max_length=32)
class Author(models.Model):
name = models.CharField(max_length=32)
class BookAuthor(models.Model):
book_id = models.ForeignKey(to='Book')
author_id = models.ForeignKey(to='Author')
优点:第三张表完全取决于自己进行额外的拓展
缺点:需要写代码较多,不能使用ORM提供的相关方法
class Book(models.Model):
name = models.CharField(max_length=32)
# 全自动
# through_fields : 当前表是谁,第一个参数就是谁
# 判断的本质:通过第三张表查询对应的表,需要用到哪个字段就把哪个字段放在前面
authors = models.ManyToManyField(to='Author', through='BookAuthor', through_fields=('book', 'author'))
class Author(models.Model):
name = models.CharField(max_length=32)
class BookAuthor(models.Model):
book_id = models.ForeignKey(to='Book')
author_id = models.ForeignKey(to='Author')
这样虽然可以使用ORM的正反向查询,但是没法使用add,set,remove,clean这四个方法
AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”。即使用Javascript语言与服务器进行异步交互,传输的数据为XML(当然,传输的数据不只是XML,现在更多使用json数据)。
AJAX除了异步的特点外,还有一个就是:浏览器页面局部刷新;(这一特点给用户的感受是在不知不觉中完成请求和响应过程想)
优点:Ajax使用JavaScript技术向服务器发送异步请求,Ajax无须刷新整个页面
后端
from django.shortcuts import render, HttpResponse
def ab_ajax(request):
if request.method == 'POST':
# print(request.POST) #
num1 = request.POST.get('i1') # 3 - 文本类型
num2 = request.POST.get('i2') # 4 - 文本类型
# 强转类型并做运算
sum = int(num1) + int(num2)
# 返回数据
return HttpResponse(sum)
return render(request, 'ab_ajax.html')
html页面
后端
from django.http import JsonResponse
from django.shortcuts import render, HttpResponse
import json
# Create your views here.
def ab_ajax(request):
if request.method == 'POST':
# print(request.POST) #
num1 = request.POST.get('i1') # 3 - 文本类型
num2 = request.POST.get('i2') # 4 - 文本类型
# 强转类型并做运算
sum = int(num1) + int(num2)
# 返回数据
data = {
"message": "success",
"sum": sum,
}
# 需要将数据序列化进行传输
return HttpResponse(json.dumps(data))
return render(request, 'ab_ajax.html')
html后端
后端
from django.http import JsonResponse
from django.shortcuts import render, HttpResponse
import json
# Create your views here.
def ab_ajax(request):
if request.method == 'POST':
# print(request.POST) #
num1 = request.POST.get('i1') # 3 - 文本类型
num2 = request.POST.get('i2') # 4 - 文本类型
# 强转类型并做运算
sum = int(num1) + int(num2)
# 返回数据
data = {
"message": "success",
"sum": sum,
}
# 需要将数据序列化进行传输
return JsonResponse(data)
return render(request, 'ab_ajax.html')
html前端
+
=
基本语法
注意
针对后端如果是用HttpResponse返回的数据,回调函数不会自动帮我们反序列化
针对后端如果是用JsonResponse返回的数据,回调函数会自动帮我们反序列化
HttpResponse解决方式
后端先进行序列化,再返回数据给前端
前端加参数进行反序列化