一、一对一模型
1.一对一模型关系:OneToOneField()
OneToOneField字段定义在关联的任何一个模型中都可以
OneToOneField等价于ForeignKey且约束unique=true
class A:
name = CharField()
class B:
a1 = OneToOneField(A)
正向查询:已知B的对象b,查询A对象:b.a1
反向查询:已知A的对象a,查询B对象:a.b
2.定义一对一模型关系
class Student(models.Model):
name = models.CharField(max_length=10, unique=True)
age = models.IntegerField(default=18)
gender = models.BooleanField(default=1)
# auto_now_add:创建数据时,默认create_time字段为当前时间
create_time = models.DateTimeField(auto_now_add=True, null=True)
# auto_now:修改时间,每次update学生信息时,修改该字段的时间为当前时间
operate_time = models.DateTimeField(auto_now=True, null=True)
chinese = models.DecimalField(max_digits=3, decimal_places=1, null=True)
math = models.DecimalField(max_digits=3, decimal_places=1, null=True)
g = models.ForeignKey(Grade, null=True)
class Meta:
# 指定Student模型映射到数据库中时,对应的表名
db_table = 'student'
class StuInfo(models.Model):
phone = models.CharField(max_length=11)
address = models.CharField(max_length=100)
stu = models.OneToOneField(Student)
class Meta:
db_table = 'stu_info'
3.正向查询
def sel_stu_by_phone(request):
# 查询phone=13908771234的学生姓名
stu_info = StuInfo.objects.get(phone='13908771234')
stu = stu_info.stu
name = stu.name
return HttpResponse(name)
4.反向查询
def sel_info_by_stu(request):
# 查询杰克的电话号码
"""
方法一:
stu = Student.objects.filter(name='杰克').first()
stu_info = StuInfo.objects.filter(stu_id=stu.id).first()
方法二:
stu_info = StuInfo.objects.filter(stu=stu).first()
"""
# 方法三:
stu = Student.objects.filter(name='杰克').first()
stu = stu.stuinfo
phone = stu.phone
return HttpResponse(phone)
二、一对多模型
1.一对多模型关系:ForeignKey()
Foreignkey字段必须定义在多的一方
class A:
name = CharField()
class B:
a1 = ForeignKey(A)
正向查询:已知B的对象b,查询A对象:b.a1
反向查询:已知A的对象a,查询B对象:a.b_set
2.定义一对多模型关系
class Student(models.Model):
name = models.CharField(max_length=10, unique=True)
age = models.IntegerField(default=18)
gender = models.BooleanField(default=1)
create_time = models.DateTimeField(auto_now_add=True, null=True)
operate_time = models.DateTimeField(auto_now=True, null=True)
chinese = models.DecimalField(max_digits=3, decimal_places=1, null=True)
math = models.DecimalField(max_digits=3, decimal_places=1, null=True)
# 指定学生和班级的关联关系
g = models.ForeignKey(Grade, null=True)
class Meta:
db_table = 'student'
class Grade(models.Model):
g_name = models.CharField(max_length=10)
create_time = models.DateTimeField(auto_now_add=True)
class Meta:
db_table = 'grade'
3.正向查询
def sel_grade_by_stu(request):
stu = Student.objects.filter(name='王大锤').first()
grade = stu.g
name = grade.g_name
return HttpResponse(name)
4.反向查询
def sel_stu_by_grade(request):
grade = Grade.objects.filter(g_name='Java').first()
stus = grade.student_set.all()
names = []
for stu in stus:
names.append(stu.name)
return HttpResponse(names)
三、多对多模型
1.多对多模型关系:ManyToManyField()
ManyToManyField字段定义在关联的任何一个模型中都可以
class A:
name = CharField()
class B:
a1 = ManyToManyField(A)
正向查询:已知B的对象b,查询A对象:b.a1
反向查询:已知A的对象a,查询B对象:a.b_set
2.定义多对多模型关系
class Student(models.Model):
name = models.CharField(max_length=10, unique=True)
age = models.IntegerField(default=18)
gender = models.BooleanField(default=1)
create_time = models.DateTimeField(auto_now_add=True, null=True)
operate_time = models.DateTimeField(auto_now=True, null=True)
chinese = models.DecimalField(max_digits=3, decimal_places=1, null=True)
math = models.DecimalField(max_digits=3, decimal_places=1, null=True)
g = models.ForeignKey(Grade, null=True)
class Meta:
db_table = 'student'
class Course(models.Model):
c_name = models.CharField(max_length=10)
stu = models.ManyToManyField(Student)
class Meta:
db_table = 'course'
3.添加模型关系
添加学生和课程的关系
def stu_course(request):
stu = Student.objects.get(name='小明')
course = Course.objects.get(c_name='线代')
# 给小明添加课程
# stu.course_set.add(course)
return HttpResponse('添加课程成功!')
4.删除模型关系
删除学生和课程的关系
def stu_course(request):
stu = Student.objects.get(name='小明')
course = Course.objects.get(c_name='线代')
# 删除小明的课程
# stu.course_set.remove(course)
return HttpResponse('删除课程成功!')
四、引入模板
1.在当前项目新建templates文件夹
2.修改setting.py配置文件
'DIRS': [os.path.join(BASE_DIR, 'templates')];
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
3.渲染页面
def index(request):
stus = Student.objects.all()
return render(request, 'index.html', {'students': stus})
五、模板标签
1.解析变量
{{ 变量 }}
2.for表达式
# 格式1:
{% for 变量 in 列表 %}
{% endfor %}
# 格式2:
{% for 变量 in 列表 %}
{% empty %}
{% endfor %}
#注意:当列表为空或者不存在时,执行empty之后的语句
forloop的用法:
{{ forloop.counter }} 表示当前是第几次循环,从1开始
{{ forloop.counter0 }} 表示当前从第几次循环,从0开始
{{forloop.revcounter}}逆序表示当前是第几次循环,到1停
{{forloop.revcounter0}}逆序表示当前是第几次循环,到0停
{{forloop.first}}是否是第一个 布尔值:True/False
{{forloop.last}}是否是最后一个 布尔值:True/False
3.if表达式
# 格式1:
{% if 表达式 %}
{% endif %}
# 格式2:
{% if 表达式 %}
{% else %}
{% endif %}
# 格式3:
{% if 表达式 %}
{% elif 表达式 %}
{% else %}
{% endif %}
4.ifequal判断相等
{% ifequal value1 value2 %}
{% endifequal %}
5.extends模板继承
extends继承,写在开头位置
{% extends '父模板路径' %}
6.block模板挖坑
{% block 关键字 %}
{% endblock %}
7.load static加载静态文件
{% load static %}
8.comment注释
多行注释,注释不可见且不可运行
{% comment %}
注释内容
{% endcomment %}
六、模板注释
1.
单行注释,可见并且可运行
2.{# #}单行注释
单行注释,页面源码中不会显示注释内容并且不可执行
{# 注释内容 #}
3.{% comment %}
多行注释,注释不可见且不可运行
{% comment %}
注释内容
{% endcomment %}
七、继承模板
1.base.html
{% block title %}
{% endblock %}
{% block css %}
{% endblock %}
{% block js %}
{% endblock %}
{% block content %}
{% endblock %}
2.base_main.html
{% extends 'base.html' %}
{% block js %}
{% endblock %}
八、填充模板
1.动态填充
{% extends 'base_main.html' %}
{% block title %}
index
{% endblock %}
{% block content %}
我是首页
编号
id
姓名
年龄
班级
{% for stu in students %}
{{ forloop.counter }}
{{ stu.id }}
{{ stu.name }}
{{ stu.age }}
{{ stu.g.g_name }}
{% endfor %}
{% endblock %}
2.静态填充
静态加载:STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
{% extends 'base_main.html' %}
{% block title %}
index
{% endblock %}
{% block css %}
{% load static %}
{% endblock %}
{% block js %}
{{ block.super }}
{% endblock %}
{% block content %}
我是首页
{% endblock %}