2015-02-17 4 views
2

Я хочу присвоить значение NullBooleanField, чтобы всегда противопоставлять другое значение поля в той же модели, за исключением None. Из моделей ниже я хочу убедиться, что значение scam равно True, значение whitelist также не может быть True. Но если scam - None, whitelist разрешено также установить на None. Ожидаемые критерии является одним из следующих параметров:Как установить значение поля модели модели django на основе другого поля в той же модели

  1. Если scam является True, допустимое значение whitelist является False или None
  2. Если scam является False, допустимое значение whitelist является True или None
  3. Если scam: None, допустимое значение whitelist: True или False или None

Итак, как убедиться, что scam всегда противоположно whitelist?

Это мой класс модели:

class ExtendHomepage(models.Model): 
    "extending homepage model to add more field" 
    homepage = models.OneToOneField(Homepage) 

    # True if the website is a scam, False if not, None if not sure 
    scam = models.NullBooleanField(blank=True, null=True) 

    # True if the webpage is already inspected, False if not 
    inspected = models.BooleanField(default=False) 

    # True if the website is already reported, False if not yet 
    reported = models.NullBooleanField(blank=True, null=True) 

    # True if the website response is 200, else it is False 
    access = models.BooleanField(default=True) 

    # True if the web should be whitelist, False if should not, None pending 
    whitelist = models.NullBooleanField(blank=True, null=True) 

ответ

1

Я не уверен, что я понял ваши критерии, но вы можете использовать проверку:

def clean(self): 
    if self.scam and self.whitelist: 
     raise ValidationError("Can't set whitelist and scam simultaneously.") 
    if self.scam is False and self.whitelist is False: 
     raise ValidationError("Negate either whitelist or scam or none.") 

Обновить ваш вопрос с truth table, чтобы мы могли понять, что ты хочешь.

+0

Я решил использовать чистый() & и перезаписать сохранить(). clean() для проверки ввода формы при редактировании существующих данных и пользовательского сохранения() для автоматического присвоения значения при вставке нового известного веб-сайта мошенничества. Спасибо за идею. – pupil

1

Вы можете сделать свойство геттер и сеттер для этой необходимости подобного ниже кода:

class ExtendHomepage(models.Model): 
    "extending homepage model to add more field" 
    homepage = models.OneToOneField(Homepage) 

    # True if the website is a scam, False if not, None if not sure 
    scam = models.NullBooleanField(blank=True, null=True) 

    # True if the webpage is already inspected, False if not 
    inspected = models.BooleanField(default=False) 

    # True if the website is already reported, False if not yet 
    reported = models.NullBooleanField(blank=True, null=True) 

    # True if the website response is 200, else it is False 
    access = models.BooleanField(default=True) 

    # True if the web should be whitelist, False if should not, None pending 

    __whitelist = models.NullBooleanField(blank=True, null=True) 

    @property 
    def whitelist(self): 
     if self.scam is not None and self.scam == self.__whitelist: 
      # this if block is not necessary but for 
      # check if content changed directly in database manager 
      # then assign None value to this attribute 
      self.__whitelist = None 
     return self.__whitelist 

    @whitelist.setter 
    def whitelist(self, value): 
     self.__whitelist = value 
     if self.scam is not None and self.scam == self.__whitelist: 
      self.__whitelist = None 
Смежные вопросы