Django网络应用开发的5项基础核心技术包括模型(Model)的设计,URL 的设计与配置,View(视图)的编写,Template(模板)的设计和Form(表单)的使用。
在django中,有一个记录了项目中所有model元数据的表,就是ContentType,表中一条记录对应着一个存在的model,所以可以通过一个ContentType表的id和一个具体表中的id找到任何记录,及先通过ContenType表的id可以得到某个model,再通过model的id得到具体的对象。
在上一个 调查问卷表设计 中,实现了简单的问卷系统并生成问卷记录。一个问卷系统主要包括:问卷,问卷中每个题目,每个题目的答案,以及生成问卷记录。
如果项目有另外一个需求,也需要与SurveryRecord建立外键关系,那么此时应该怎么做呢?是再给上面的表增加一个外键,然后重新修改数据库么?显然是不能,一旦数据库被创建了,几乎很少再去修改数据,如果再给其添加额外字段,无疑会带来不必要的麻烦。为此,可以利用Django自带的ContentType类,来做这件事情。
from django.db import models
from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation
from django.contrib.contenttypes.models import ContentType
class Survery(models.Model):
"""
问卷
ID name by_class creator
1 第一次班级调查 大一计算机205班 张老师
"""
name = models.CharField(verbose_name="调查问卷名称", max_length=128, unique=True)
by_class = models.ForeignKey("ClassList", verbose_name="问卷调查班级", on_delete=models.SET_NULL, blank=True, null=True)
date = models.DateTimeField(verbose_name="问卷创建日期", auto_now_add=True)
creator = models.ForeignKey("UserInfo", verbose_name="创建者", on_delete=models.SET_NULL, blank=True, null=True)
class SurveryItem(models.Model):
"""
问卷题目
ID survery name date answer_type
1 1(代表上面创建的第一次班级调查) 您最喜欢吃什么水果? xxx-xxx-xx 1
"""
survery = models.ForeignKey('Survery', verbose_name='问卷', on_delete=models.SET_NULL, blank=True, null=True)
name = models.CharField(verbose_name="调查问题", max_length=255)
date = models.DateField(auto_now_add=True)
answer_type_choices = (
(1, "打分(1~10分)"),
(2, "单选"),
(3, "建议"),
)
answer_type = models.IntegerField(verbose_name="问题类型", choices=answer_type_choices, default=1)
class SurveryChoices(models.Model):
"""
问卷选项答案(针对选项类型)
ID item content points
1 2 A 10分
1 2 B 9分
1 2 C 8分
1 2 D 7分
"""
item = models.ForeignKey('SurveryItem', verbose_name='问题', on_delete=models.SET_NULL, blank=True, null=True)
content = models.CharField(verbose_name='内容', max_length=256)
points = models.IntegerField(verbose_name='分值')
surveryrecord = GenericRelation("SurveryRecord")
将评分和建议从问卷记录中单独提取作为一个模型类
class Score(models.Model):
"""
问卷评分
"""
item = models.ForeignKey('SurveryItem', verbose_name='问题', blank=True, null=True, on_delete=models.SET_NULL)
points = models.IntegerField(verbose_name='分值')
surveryrecord = GenericRelation("SurveryRecord")
class Suggestion(models.Model):
"""
问卷建议
"""
item = models.ForeignKey('SurveryItem', verbose_name='问题', blank=True, null=True, on_delete=models.SET_NULL)
suggests = content = models.CharField(verbose_name='内容', max_length=256)
surveryrecord = GenericRelation("SurveryRecord")
如果一个表与其它表有多个外键关系,可以通过ContentType来解决这种关联
class SurveryRecord(models.Model):
"""
问卷记录
ID survery student_name survery_item content_type object_id
1 1 1 1 1 1
1 1 1 2 1 2
1 1 1 3 1 3
"""
survery = models.ForeignKey("Survery", verbose_name="问卷", blank=True, null=True, on_delete=models.SET_NULL)
student_name = models.ForeignKey("Student", verbose_name="学员姓名", blank=True, null=True, on_delete=models.SET_NULL)
survery_item = models.ForeignKey('SurveryItem', verbose_name="调查项", blank=True, null=True, on_delete=models.SET_NULL)
content_type = models.ForeignKey(ContentType, blank=True, null=True)
object_id = models.PositiveIntegerField(blank=True, null=True)
content_object = GenericForeignKey('content_type', 'object_id') # 这个字段不会再数据库中存在,只是在查询时有用
date = models.DateTimeField(verbose_name="答题日期", auto_now_add=True)
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有