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

Django中Question模型新增后自动为Choice插入固定选项的实现问题

Django新增Question后自动填充固定Choice的实现方案

有两种常见实现方式,可根据业务场景选择:

方式一:修改QuestionHelper创建逻辑(推荐,业务逻辑更可控)

直接在Question创建成功后插入固定选项,仅通过你现有createQuestion方法创建Question时触发,不会额外影响其他场景的Question创建操作。
修改后的QuestionHelper代码如下:

from .models import Choice # 注意提前导入Choice模型

class QuestionHelper(object):
    @classmethod
    def createQuestion(klass, questiondata):
        """
        creates a question
        """
        createdQuestion = QuestionSerializer(data=questiondata)
        if createdQuestion.is_valid():
            # 保存序列化器,获取新建的Question实例
            question_instance = createdQuestion.save()
            # 批量创建三个固定选项
            Choice.objects.bulk_create([
                Choice(question=question_instance, choice_text="Yes"),
                Choice(question=question_instance, choice_text="No"),
                Choice(question=question_instance, choice_text="Abstain"),
            ])
            return createdQuestion.data, True
        return createdQuestion.errors, False

方式二:使用Django post_save信号(适合全局所有新增Question场景都要触发)

如果要求所有场景下新增Question(包括后台管理、Shell操作、其他业务逻辑创建)都自动生成选项,可以用Django信号实现:

  1. 首先在你的app目录下新建signals.py,添加如下代码:
from django.db.models.signals import post_save
from django.dispatch import receiver
from .models import Question, Choice

@receiver(post_save, sender=Question)
def create_default_choices(sender, instance, created, **kwargs):
    # 仅首次创建Question时触发,避免更新操作重复生成选项
    if created:
        Choice.objects.bulk_create([
            Choice(question=instance, choice_text="Yes"),
            Choice(question=instance, choice_text="No"),
            Choice(question=instance, choice_text="Abstain"),
        ])
  1. 注册信号:修改app的apps.py文件,在AppConfig的ready方法中导入信号:
from django.apps import AppConfig

class YourAppConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = '替换为你的app名称'

    def ready(self):
        import 替换为你的app名称.signals

注意事项

  • 两种方式二选一即可,不需要同时实现
  • Choice模型中question字段的default=1配置可以移除,避免出现无效的默认关联

内容的提问来源于stack exchange,提问作者Christopher Kinyua

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 00:36:08