day44-Django模型关系和模板

一、一对一模型

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 %}
    

我是首页

{% for stu in students %} {% endfor %}
编号 id 姓名 年龄 班级
{{ forloop.counter }} {{ stu.id }} {{ stu.name }} {{ stu.age }} {{ stu.g.g_name }}
{% 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 %}

你可能感兴趣的:(day44-Django模型关系和模板)