Django-第二部分(熟练掌握)-模型(Model)设计-定义模型类(练习)
文章目录
目标
前面已经介绍了如何快速入门,现在开始熟练掌握一些知识
- 掌握定义模型类
回顾
a、模型(Model)设计流程过程说明
一、数据库表设计
为方便后续使用,先定义好一个数据库和表结构。
二、定义单表的模型类
单表关系为 老师表(teacher), 年级表(grade)
class Teacher(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=16, verbose_name="教师名称")
class Meta:
db_table = 't_teacher' # 定义表名为t_teacher
def __str__(self):
# 默认显示类的name字段
return self.name
class Grade(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=16, verbose_name="年级名称")
class Meta:
db_table = 't_grade'
def __str__(self):
# 默认显示类的name字段
return self.name
代码说明:
- 相关字段作用可以参考前面讲解模型类字段使用
三、定义一对多的模型类
一对多关系为班级表(class)、学生表(student)、课程表(course)
class Class(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=16, verbose_name="编辑名称")
grade_id = models.ForeignKey(to='Grade', to_field='id', on_delete=models.CASCADE, db_column="grade_id")
class Meta:
db_table = 't_class'
def __str__(self):
# 默认显示类的name字段
return self.name
class Student(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=16, verbose_name="学生名称")
GENDER_CHOICES = (
(0, u"女"),
(1, u"男"),
)
gender = models.CharField(max_length=4, verbose_name="性别", choices=GENDER_CHOICES)
class_id = models.ForeignKey(to='Class', to_field='id', on_delete=models.CASCADE, db_column="class_id")
class Meta:
db_table = 't_student'
def __str__(self):
# 默认显示类的name字段
return self.name
class Course(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=16, verbose_name="课程名称")
teacher_id = models.ForeignKey(to='Teacher', to_field='id', on_delete=models.CASCADE, db_column="teacher_id")
class Meta:
db_table = 't_course'
def __str__(self):
# 默认显示类的name字段
return self.name
代码说明:
- 处理一对多关系,主要使用 models.ForeignKey 来定义,想自己定义字段名称可以使用 选项参数db_column
四、定义多对多的模型类
多对多关系为老师执教班级表(teacher2cls)、成绩表(score)
class Teacher(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=16, verbose_name="教师名称")
class_id = models.ManyToManyField(to='Class', db_column="class_id", db_table="t_teach2cls")
class Meta:
db_table = 't_teacher' # 定义表名为t_teacher
def __str__(self):
# 默认显示类的name字段
return self.name
代码说明:
- 由于是多对多关系,可定义在任意一段,我这里定义在Teacher中,使用
models.ManyToManyField
定义,由于希望指定多对多生成的表名使用db_table="t_teach2cls"
参数进行指定。
class Student(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=16, verbose_name="学生名称")
GENDER_CHOICES = (
(0, u"女"),
(1, u"男"),
)
gender = models.CharField(max_length=4, verbose_name="性别", choices=GENDER_CHOICES)
class_id = models.ForeignKey(to='Class', to_field='id', on_delete=models.CASCADE, db_column="class_id")
course_id = models.ManyToManyField(to='Course', through='Score', through_fields=('student_id', 'course_id'),
db_column="course_id")
class Meta:
db_table = 't_student'
def __str__(self):
# 默认显示类的name字段
return self.name
class Score(models.Model):
id = models.AutoField(primary_key=True)
student_id = models.ForeignKey(verbose_name='学生', to="Student", to_field='id', on_delete=models.CASCADE,
db_column="student_id")
course_id = models.ForeignKey(verbose_name='课程', to="Course", to_field='id', on_delete=models.CASCADE,
db_column="course_id")
score = models.IntegerField(verbose_name="分数", default=0)
class Meta:
db_table = 't_score'
unique_together = [('student_id', 'course_id'), ]
def __str__(self):
v = self.student_id.name + "---" + self.course_id.name
return v
代码说明:
- 由于是多对多关系,并且新增加了额外字段,需要使用一个新的类
Score
来定义新的表。同时在任意一段,使用models.ManyToManyField
定义。但需要将其关联到新的类course_id = models.ManyToManyField(to='Course', through='Score', through_fields=('student_id', 'course_id'), db_column="course_id")