如何修改Django多选题模型以支持多正确答案?
问题描述
我正在开发一款用于多选题考试的Django应用,已创建如下Question模型:
class Question(models.Model): subject = models.ForeignKey(Subject, on_delete=models.CASCADE) question_name = models.CharField(max_length=200,null=True) option1 = models.CharField(max_length=200,null=True) option2 = models.CharField(max_length=200,null=True) option3 = models.CharField(max_length=200,null=True) option4 = models.CharField(max_length=200,null=True) answer = models.CharField(max_length=200,null=True) def __str__(self): return self.question_name
当前模型运行正常,但我希望修改它,使题目可拥有多个正确选项。我将通过admin面板添加题目,需要添加题目、选项并标记一个或多个正确答案,或设置字段存储多个正确答案。是否存在可同时作为CharField和BooleanField的字段?或是我应采用何种方案实现需求?
解决方案
Django没有同时兼具CharField和BooleanField特性的字段,推荐以下两种方案实现多选题需求:
方案一:基于现有模型扩展(固定选项数量)
直接给每个选项对应添加Boolean字段,标记该选项是否为正确答案,改动小且admin操作直观。
修改后的模型代码:
class Question(models.Model): subject = models.ForeignKey(Subject, on_delete=models.CASCADE) question_name = models.CharField(max_length=200,null=True) # 选项内容字段 option1 = models.CharField(max_length=200,null=True) option2 = models.CharField(max_length=200,null=True) option3 = models.CharField(max_length=200,null=True) option4 = models.CharField(max_length=200,null=True) # 对应选项的正确性标记 is_option1_correct = models.BooleanField(default=False) is_option2_correct = models.BooleanField(default=False) is_option3_correct = models.BooleanField(default=False) is_option4_correct = models.BooleanField(default=False) def __str__(self): return self.question_name
- 优点:改动成本低,admin面板中直接通过勾选框标记正确选项,操作简单
- 缺点:选项数量固定为4个,后续调整选项数量需修改模型
方案二:拆分关联模型(支持动态选项数量)
如果需要支持动态增减选项数量,推荐采用一对多关联的设计,创建独立的Option模型与Question关联,每个选项自带正确性标记。
模型代码
class Question(models.Model): subject = models.ForeignKey(Subject, on_delete=models.CASCADE) question_name = models.CharField(max_length=200,null=True) def __str__(self): return self.question_name class Option(models.Model): question = models.ForeignKey(Question, on_delete=models.CASCADE, related_name='options') content = models.CharField(max_length=200) is_correct = models.BooleanField(default=False) def __str__(self): return self.content
适配Django Admin
为了在admin面板中直接给题目添加/编辑选项,需要配置InlineModelAdmin:
from django.contrib import admin from .models import Question, Option class OptionInline(admin.TabularInline): model = Option extra = 4 # 默认显示4个选项输入框,可按需调整 class QuestionAdmin(admin.ModelAdmin): inlines = [OptionInline] admin.site.register(Question, QuestionAdmin) admin.site.register(Option)
- 优点:选项数量完全动态,模型设计符合数据库规范,扩展性强
- 缺点:需要额外创建模型和配置admin,初期工作量略大
内容的提问来源于stack exchange,提问作者Yogesh Bhagat
相关产品推荐
相关产品推荐

