【问题标题】:Django Admin Manager OverrideDjango 管理管理器覆盖
【发布时间】:2016-03-12 00:29:51
【问题描述】:

我有一个多项选择题,其中模型Question 是问题,Choices 作为答案。我想将一个Question可以创建的Choices的数量限制为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)

Choice

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

如果我使用 python shell 创建模型实例,一切正常。

但是:当我使用 AdminSite 时。我可以为一个问题创建超过 4 个选项。如何在 AdminSite(在管理站点引发错误)获得我想要的行为?在管理员级别覆盖经理?我将如何进行?

admin.site.register(Question)
admin.site.register(Choice) 

【问题讨论】:

    标签: python django django-admin django-managers


    【解决方案1】:

    需要覆盖模型类本身中的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)
    

    【讨论】: