二、笔记本端
接(七),继续完成Django的相关配置
(六)数据库设计
这一段因为换了电脑(windows 10),所以,先大概记录下,这几天,主要是在解决数据库设计的问题,主要是依据课程考核的要求,结合课程内容科目,设计表格,完成各个表格的对应关系,有一对一,一对多,多对多。但这个设计不是一开始就全部设计好的,是通过试验,发现表格中存在的问题,而后一步步修改的,就是各个表格字段随时都可能改变,有时候是换名称,有时候是换类型,有时候是换对应关系,甚至有时候还好调整整个表格的结构。
就以项目评分表ItemScore为例,这个表中首先要明确项目名称item,还要明确编组team,(通过编组知道是哪些学生),还要有评分老师teacher,当然还要有评分结果itemScore。
- 被其他表格引用的值的设定,需要在def str(self):这个函数中体现,其返回值就是其他表格引用该表格所获得的值,而这个值必须是字符串,所以,需要把不是字符串的转换为字符串
Lesson/model.py的文件中表ContentScore的字段item和team分别引用了表Item和表Team,因为表Item的def str(self):返回的是self.itemName,因此,在表ContentScore中字段item就会显示表Item字段itemName的值,同理,因为表Team的def str(self):返回的是str(self.item)+str(self.teamOrder),因此,在表ContentScore中字段team就会显示表team字段item和字段teamOrder组合的值。
# Lesson/model.py
class ContentScore(models.Model):
id = models.AutoField(primary_key=True)
content = models.ForeignKey("Content", verbose_name='考核内容', on_delete=models.CASCADE)
item = models.ForeignKey("Item", verbose_name='考核项目', on_delete=models.CASCADE)
team = models.ForeignKey("Team", verbose_name='组别',on_delete=models.CASCADE)
teacher = models.ForeignKey("Teacher", verbose_name='评分老师', on_delete=models.CASCADE)
contentScore = models.DecimalField(verbose_name='内容成绩',max_digits=5, decimal_places=2)
contentDate = models.DateField(verbose_name='考核日期', auto_now_add=True)
def __str__(self):
return str(self.contentScore)
class Meta:
verbose_name = '内容成绩'
verbose_name_plural = '内容成绩'
# 被引用的表Item
class Item(models.Model):
itemID = models.CharField(verbose_name='项目编号', unique=True, max_length=32)
itemName = models.CharField(verbose_name='项目名称', max_length=32)
itemWeight = models.DecimalField(verbose_name='项目权重', max_digits=5, decimal_places=2)
teamMode = models.ForeignKey("TeamMode", verbose_name='分组模式', blank=True, on_delete=models.CASCADE)
subject = models.ForeignKey("Subject", verbose_name='课目名称', on_delete=models.CASCADE)
def __str__(self):
return self.itemName
class Meta:
verbose_name = '项目详情'
verbose_name_plural = '项目详情'
# 被引用的表Team
class Team(models.Model):
teamID = models.CharField(verbose_name='分组编号', unique=True, max_length=32)
item = models.ForeignKey("Item", verbose_name='项目名称', null=True, on_delete=models.CASCADE)
teamOrder = models.SmallIntegerField(verbose_name='分组序号')
teamDate = models.DateField(verbose_name='分组日期', null=True, auto_now_add=True)
def teamName(self):
return (str(self.item)+str(self.teamOrder))
def __str__(self):
return self.teamName()
class Meta:
verbose_name = '考核分组'
verbose_name_plural = '考核分组'
如下图所示,组别就是显示的字段item(项目名称)和字段teamOrder(分组序号)组合的值
- 当需要数据迁移出错是,需要导出数据,需要使用命令
# 这个应用的导出
python manage.py dumpdata Lesson>data.json
# 只导出应用的某个表
python manage.py dumpdata Lesson.student>student.json
- 如果要导入数据
# 这个应用的导出
python manage.py loaddata data.json
#只导出应用的某个表
python manage.py loaddata student.json
- 如果要使用mysql 查看数据表需要使用如下命令:
首先 登录mysql
~$ mysql -u root -p
而后显示所有数据库
mysql> show databases;
接着使用数据库
mysql> use qbpb;
而后显示该数据库下所有表
mysql> show tables;
显示表的结构
>mysql> DESC Lesson_student;
当然还可以操作更多,具体的细节,请看mysql教程,这里所有关于你要问的关于Mysql的答案都有
- 还有在Django admin 后台显示 自定义标题,去掉表格名称后面的‘s’等等。
添加verbose_name_plural 即可以去掉表格名称后面的s
class ItemScorePhoto(models.Model):
itemImages = models.ImageField(verbose_name='考核照片', upload_to='images/itemScore/%Y/%m/%d')
itemScore = models.ForeignKey("ItemScore", verbose_name='项目分组', on_delete=models.CASCADE)
itemPhotoDate = models.DateField(verbose_name='照片日期', auto_now_add=True)
class Meta:
verbose_name = '项目照片'
verbose_name_plural = '项目照片'
在Django admin 后台显示 自定义标题通过在Lesson/admin.py 文件中添加如下代码实现:
admin.site.site_title = '课程后台管理'
admin.site.site_header = '课程管理'
- 要在Django后台显示数据表,需要在Lesson/admin.py中注册,比如1中提到的3个表,需要注册如下:
#Lesson/admin.py
from django.contrib import admin
from .models import *
@admin.register(ContentScore)
class ContentScoreInfoAdmin(admin.ModelAdmin):
# 设置要显示的字段
list_display = ['id', 'content', 'item', 'team', 'teacher', 'contentScore', 'contentDate']
@admin.register(Team)
class TeamInfoAdmin(admin.ModelAdmin):
# 设置要显示的字段
list_display = ['id', 'teamID', 'item', 'teamOrder', 'teamDate']
@admin.register(Item)
class ItemInfoAdmin(admin.ModelAdmin):
# 设置要显示的字段
list_display = ['id', 'itemID', 'itemName', 'itemWeight', 'teamMode', 'subject']