Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django管理器覆盖_Python_Django_Django Admin_Django Managers - Fatal编程技术网

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)