2015-12-07 84 views
0

我有一个选择题,其中Question是问题,Choices是答案。我想将可创建的Choices的数量限制为Question为4.Django Admin Manager覆盖

A 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) 

回答

0

需要覆盖模型类本身的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) 
相关问题