7、Django_模型类开发示例

2019-09-30  本文已影响0人  猪儿打滚
一、示例的表关系

这里需注意表与表之间的主从表关系,因为外键字段需要在主表(“多”的表)
1.对于助教来说,导师是从表
2.对于学生来说,课程是从表
3.对于课程来说,导师是从表
PS.
主从表的确定,需要从业务角度来确定。比如说如果这个系统是开发给老师用的,那么课程是主表;如果开发给学生用的,那么学生是主表。

表关系
二、编写代码

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直接生成数据库
结果: 创建成功

查看表的关联关系:


查看表的关联关系
创建的所有表
相关表
上一篇 下一篇

猜你喜欢

热点阅读