一、示例的表关系
这里需注意表与表之间的主从表关系,因为外键字段需要在主表(“多”的表)
1.对于助教来说,导师是从表
2.对于学生来说,课程是从表
3.对于课程来说,导师是从表
PS.
主从表的确定,需要从业务角度来确定。比如说如果这个系统是开发给老师用的,那么课程是主表;如果开发给学生用的,那么学生是主表。
![](https://img.haomeiwen.com/i13826085/dec5fb66dbd122f7.png)
二、编写代码
1.创建一个名为class的应用:python manage.py startapp class
2.在settings.py
文件进行注册该应用,添加:'class.apps.ClassConfig'
3.编写Model类:class/models.py
from django.db import models
"""
author:lzl
"""
# Create your models here.
class Teacher(models.Model):
""" 导师信息表 """
nickname = models.CharField(max_length=50, primary_key=True, db_index=True, verbose_name='昵称') # 主键、索引
introduction = models.TextField(default='这位导师还没添加个人简介', verbose_name='简介')
fans = models.PositiveIntegerField(default='0', verbose_name='关注数')
created_at = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
updated_at = models.DateTimeField(auto_now=True, verbose_name='更新时间')
class Meta:
verbose_name = '导师信息表'
verbose_name_plural = verbose_name
def __str__(self): # python2是__unicode__
return self.nickname
class Course(models.Model):
""" 课程信息表 """
title = models.CharField(max_length=100, primary_key=True, db_index=True, verbose_name='课程名')
teacher = models.ForeignKey(Teacher, null=True, blank=True, on_delete=models.CASCADE,
verbose_name='课程导师') # 多对一外键,对应Teacher表。如果老师被删除了,那么对应的课程则被删除
type = models.CharField(choices=((0, '其它'), (1, '免费课'), (2, '付费课')), max_length=1, default=0,
verbose_name='课程类型') # choices,对应数据库的枚举,节省空间,且提高效率
price = models.PositiveSmallIntegerField(verbose_name='价格')
volume = models.BigIntegerField(verbose_name='销量')
online = models.DateField(verbose_name='上线时间')
created_time = models.DateTimeField(auto_created=True, verbose_name='创建时间')
updated_time = models.DateTimeField(auto_now=True, verbose_name='更新时间')
class Meta:
verbose_name = '课程信息表'
verbose_name_plural = verbose_name
def __str__(self):
return F'{self.get_type_display()} - {self.title}' # 获取type中元组索引对应的值,并和title进行拼接显示
class Student(models.Model):
""" 学生信息表 """
nickname = models.CharField(primary_key=True, max_length=50, db_index=True, verbose_name='昵称')
course = models.ManyToManyField(Course, verbose_name='课程') # 多对多,对应课程表
age = models.PositiveSmallIntegerField(verbose_name='年龄')
gender = models.CharField(choices=((0, '保密'), (1, '男'), (2, '女')), max_length=1, default=0, verbose_name='性别')
study_time = models.PositiveIntegerField(default='0', verbose_name='学习时长/h')
created_at = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
updated_at = models.DateTimeField(auto_now=True, verbose_name='更新时间')
class Meta:
verbose_name = '学生信息表'
verbose_name_plural = verbose_name
def __str__(self):
return self.nickname
class TeacherAssistant(models.Model):
""" 助教信息表 """
nickname = models.CharField(max_length=30, primary_key=True, db_index=True, verbose_name='昵称')
teacher = models.OneToOneField(Teacher, on_delete=models.SET_NULL, null=True, blank=True,
verbose_name='导师') # 一对一外键,导师被删除,助教依旧保留
hobby = models.CharField(max_length=100, null=True, blank=True, verbose_name='爱好')
created_at = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
updated_at = models.DateTimeField(auto_now=True, verbose_name='更新时间')
class Meta:
verbose_name = '助教信息表'
verbose_name_plural = verbose_name
def __str__(self):
return self.nickname
4.迁移数据表
python manage.py makemigrations # 生成migrations临时文件
python manage.py migrate # 根据migrations直接生成数据库
结果:
![](https://img.haomeiwen.com/i13826085/02b7232a29f11e58.png)
查看表的关联关系:
![](https://img.haomeiwen.com/i13826085/77fdca28a71f80ff.png)
![](https://img.haomeiwen.com/i13826085/e36f6895c321c8be.png)
![](https://img.haomeiwen.com/i13826085/d221fb65730c15d1.png)
网友评论