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信号实现:
- 首先在你的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"), ])
- 注册信号:修改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
相关产品推荐
相关产品推荐

