You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 07:11:14