发布于2023-03-21 00:57 阅读(1056) 评论(0) 点赞(28) 收藏(1)
我想为命名的问题创建基本模型Question
,并通过任何其他问题类型对其进行扩展:
class Question(models.Model):
questionnaire = models.ForeignKey(to='Questionnaire', on_delete=models.CASCADE, related_name='questions')
question = models.TextField()
description = models.TextField(null=True, blank=True)
media = models.FileField(upload_to='medias', blank=True, null=True)
is_required = models.BooleanField(default=False)
def __str__(self):
return f'{self.questionnaire.name} - {self.question}'
我想像这样扩展它:
class OptionalQuestion(Question):
multiple_choice = models.BooleanField(default=False)
additional_options = models.BooleanField(default=False)
# If multiple_choice is True, then max_selected_options and min_selected_options will be used
max_selected_options = models.IntegerField(null=True, blank=True)
min_selected_options = models.IntegerField(null=True, blank=True)
# If additional_options is True, then all_options and nothing_selected will be used
all_options = models.BooleanField(default=False, null=True, blank=True)
nothing_selected = models.BooleanField(default=False, null=True, blank=True)
def save(self, *args, **kwargs):
if not self.multiple_choice:
self.max_selected_options = None
self.min_selected_options = None
if not self.additional_options:
self.all_options = None
self.nothing_selected = None
if self.nothing_selected or self.all_options:
self.all_options = False
self.multiple_choice = False
super().save(*args, **kwargs)
在第一次创建迁移时一切都很好但是下次 Django 要我为'question_ptr'字段提供默认值时我什至不知道这个字段是什么
我尝试将基类抽象化,并且在进行迁移时 Django 向我显示了很多这样的错误:
question_app.TextAnswerQuestion.questionnaire: (fields.E305) Reverse query name for 'question_app.TextAnswerQuestion.questionnaire' clashes with reverse query name for 'question_app.DropDownQuestion.questionnaire'.
HINT: Add or change a related_name argument to the definition for 'question_app.TextAnswerQuestion.questionnaire' or 'question_app.DropDownQuestion.questionnaire'.
question_app.TextAnswerQuestion.questionnaire: (fields.E305) Reverse query name for 'question_app.TextAnswerQuestion.questionnaire' clashes with reverse query name for 'question_app.NumberAnswerQuestion.questionnaire'.
HINT: Add or change a related_name argument to the definition for 'question_app.TextAnswerQuestion.questionnaire' or 'question_app.NumberAnswerQuestion.questionnaire'.
question_app.TextAnswerQuestion.questionnaire: (fields.E305) Reverse query name for 'question_app.TextAnswerQuestion.questionnaire' clashes with reverse query name for 'question_app.OptionalQuestion.questionnaire'.
HINT: Add or change a related_name argument to the definition for 'question_app.TextAnswerQuestion.questionnaire' or 'question_app.OptionalQuestion.questionnaire'.
我不知道该怎么办
首先使问题模型抽象=真
当抽象基类中有ForeignKey关系时,每个派生类都会有这种关系。所以你不能硬编码它的related_name,因为所有派生类都会尝试在相关类上创建相同的访问器。
正如 Django 文档所建议的那样,您可以在问题模型中执行以下操作:
questionnaire = models.ForeignKey(to='Questionnaire', on_delete=models.CASCADE, related_name="%(app_label)s_%(class)s_questions")
在此处查看 Django 文档。点击这里
作者:黑洞官方问答小能手
链接:https://www.pythonheidong.com/blog/article/1941137/fc7aa83522be8249ab18/
来源:python黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 python黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-1
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!