Поле модели, зависящее от объекта внешнего ключа той же модели
Название кажется сложным, но на самом деле это не так.
Допустим, у меня есть 2 модели:
Первый - "Варианты", который содержит заголовок и булево число, позволяющее определить, правильный выбор или нет.
class Choice(models.Model):
content = models.CharField(max_length=200, default=None)
correct = models.BooleanField(default=False)
Второе - это проверка, которая проверяет, правильно ли выбрано использование:
class CheckQuestion(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
selected_choice = models.ForeignKey(Choice, on_delete=models.CASCADE)
correct = models.BooleanField(default=None)
Правильное поле должно быть равно правильному полю выбранного варианта. Таким образом, в основном:
correct = selected_choice.correct
Я пробовал реализовать их с помощью @property следующим образом:
@property
def correct(self):
if self.selected_choice.correct:
correct = True
else:
correct = False
return correct
Попробовал сохранить следующим образом:
def save(self,*args,**kwargs):
self.correct = self.selected_choice.correct
super(CheckQuestion,self).save(*args,**kwargs)
Но ни то, ни другое не сработало, метод property выдавал ошибку "cannot be null", а метод save просто всегда возвращал false.
Что еще я могу сделать?
Во-первых, вы установили значение по умолчанию для вашего поля BooleanField равным None
, но вы не допускаете нулевых значений. Вы должны установить значение False
, чтобы сделать основной шаблон модели Choice. Это объясняет ошибку метода.
correct = models.BooleanField(default=None) # change to False
Во-вторых, ваш метод моделирования может быть упрощен - нет необходимости в выражении if.
@property
def correct(self):
return self.selected_choice.correct
По поводу того, почему опция переопределения save()
всегда возвращает False, кажется, что объект Choice должен иметь корректное поле False. Я бы посоветовал трижды проверить, так это или нет - код save()
, на мой взгляд, выглядит нормально.