Как установить по умолчанию для поля модели значение атрибута OneToOneField? - PullRequest
0 голосов
/ 22 февраля 2020

Существуют модели Lecture и Task. Каждая лекция имеет топи c. И у каждой задачи есть топи c и лекция.

class Lecture(models.Model):
    topic = models.CharField(max_length=30, blank=False)


class Task(models.Model):
    lecture = models.OneToOneField(Lecture, on_delete=models.CASCADE)
    topic = models.CharField(
        max_length=30,
        blank=False,
    )

Я хочу установить значение Task.topic так же, как Lecture.topic, к которому относится эта задача. Например:

lecture1 = Lecture('Awesome topic')
lecture1.save()

task1 = Task(lecture1)
task1.save()
# here task1.topic must be 'Awesome topic'

Я пробовал эту вещь:

class Task(models.Model):
    lecture = models.OneToOneField(Lecture, on_delete=models.CASCADE)
    topic = models.CharField(
        max_length=30,
        blank=False,
        default=lecture.topic
    )

, но есть

Объект 'OneToOneField' не имеет атрибута 'topi c '

1 Ответ

1 голос
/ 22 февраля 2020

Вы можете перезаписать метод сохранения и сделать необходимые логи c перед фактическим сохранением:

class Task(models.Model):

    ...

    def save(self, *args, **kwargs):
        self.topic = self.lecture.topic
        super(Task, self).save(*args, **kwargs)

Есть ли причина оставить topic в Task? Это избыточно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...