Поле модели, зависящее от объекта внешнего ключа той же модели

Название кажется сложным, но на самом деле это не так.

Допустим, у меня есть 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(), на мой взгляд, выглядит нормально.

Вернуться на верх