Django signal не работает на post_save() создания CourseOverview, затем создается запись в таблице CustomCourseOverview также

signals.py @receiver(post_save, sender=CourseOverview) def add_custom(sender, instance,created,**kwargs): course, _=CustomCourseOverview.objects.update_or_create(course=instance.id)

models.py

class CustomCourseOverview(TimeStampedModel): course = models.OneToOneField( CourseOverview, db_constraint=False, db_index=True, on_delete=models.CASCADE, )

apps.py def ready(self):

  also add signal valid path  

Не работает, потому что может возникнуть ситуация, когда данные, которые вы вводите для создания объекта модели, не подтверждаются в какой-либо форме или не соответствуют требованиям, определенным моделью, например, max_length увеличен или любым другим способом.

Во время создания объекта модели срабатывают оба сигнала, во время создания срабатывает pre_save и во время сохранения срабатывает post_save, но по какой-то причине, если экземпляр не сохранен, вы не можете получить экземпляр в фрагменте кода в сигналах, если он не создан, если он не создан, вы не можете иметь instance.id, что даст определенную ошибку .

здесь в строке 3 есть вероятность ошибки :

@receiver(post_save, sender=CourseOverview)
def add_custom(sender, instance,created,**kwargs):
    course, _=CustomCourseOverview.objects.update_or_create(course=instance.id)

так что добавьте оператор if, указывающий, что сделайте материал создания, параметр created дает значение bool, говорящее, создан объект или нет. (true или false), так что вы получите экземпляр .

@receiver(post_save, sender=CourseOverview)
def add_custom(sender, instance,created,**kwargs):
    if created : 
        course, _=CustomCourseOverview.objects.update_or_create(course=instance.id)
        course.save()

Если вы хотите обновить вещь. Вы не можете этого сделать, потому что может быть случай, когда ваш CourseOverview связан с другой моделью CustomCourseOverview, и поэтому это невозможно .

Попробуйте использовать простой appraoch. Когда он создан, запустите сигнал post_save для создания нового объекта CustomCourseOverview, а для его обновления используйте формы или другой способ. Это сделает всю работу.

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