Python Django管理器覆盖
我有一个选择题,其中,Python Django管理器覆盖,python,django,django-admin,django-managers,Python,Django,Django Admin,Django Managers,我有一个选择题,其中,问题是问题,选择作为答案。我想将可创建的问题的选项数限制为4个 models.Manager用于验证问题的选择数量 class Question(models.Model): QUESTION_TYPES = ( ('MC', 'Multiple Choice'), ('SB', 'Subjective'), ) question_type = models.CharField(choices=QUESTION_TYPES, max_
问题
是问题,选择
作为答案。我想将可创建的问题的选项数限制为4个
models.Manager用于验证问题的选择数量
class Question(models.Model):
QUESTION_TYPES = (
('MC', 'Multiple Choice'),
('SB', 'Subjective'),
)
question_type = models.CharField(choices=QUESTION_TYPES, max_length=2, default='MC')
question_text = models.TextField(null=False, blank=False)
和选择
class Choice(models.Model):
choice_text = models.CharField(max_length=100, null=True)
question= models.ForeignKey(Question, null=True , related_name='choices')
is_answer = models.BooleanField(default=False)
objects = ChoiceManager()
自定义Manager
class ChoiceManager(models.Manager):
def create(self, **kwargs):
question = kwargs.pop('question',None)
if question is not None:
if question.choices.all().count() > 4: # see related_name
raise AssertionError
else:
return self
如果我使用pythonshell创建模型实例,那么一切都可以正常工作
但是:当我使用管理员站点时。我能够为一个问题创建4个以上的选项。我如何在AdminSite实现我想要的行为(在AdminSite引发错误)?是否在管理级别覆盖管理器?我该怎么做
admin.site.register(Question)
admin.site.register(Choice)
需要重写模型类本身中的save
方法
class Choice(models.Model):
choice_text = models.CharField(max_length=100, null=True)
question= models.ForeignKey(Question, null=True , related_name='choices')
is_answer = models.BooleanField(default=False)
objects = ChoiceManager()
def save(self, *args, **kwargs):
if self.question.choices.all().count() > 4:
print "You Shall Not Save"
raise ValueError
else:
print "Super Method Called"
super(Choice, self).save(*args, **kwargs)