Django выбрасывает ValueError: save () запрещено, чтобы предотвратить потерю данных из-за несохраненного метода сохранения связанного объекта - PullRequest
0 голосов
/ 04 июня 2019

Я пытаюсь создать некоторые объекты модели ABC из метода сохранения модели XYZ, когда создается объект моделей XYZ.См. Код ниже для справки:

Class XYZ(models.Model):
    name = models.CharField(max_length=150)
    #Other Feilds
    def save(self, *args, **kwargs):
            self.match_tick = self.match_date.timestamp()
            contest_obj_1 = ContestDetail(
                                contest_of_ABC=self,
                                contest_name="₹1000 Winnnings",
                                filled_status = False,
                            )
            contest_obj_1.save()
        super(MatchDetail, self).save(*args, **kwargs)

Class ABC(models.Model):
    contest_of_ABC = models.ForeignKey(XYZ)
    contest_name = models.CharField(max_length=100)
    filled_status = models.BooleanField(default=False)

А вот строки ошибок:

File "./center/models.py", line 47, in save
    contest_obj_1.save()   File "./center/models.py", line 203, in save
    super(ContestDetail, self).save(*args, **kwargs)   File "/home/FightBack/.virtualenvs/ENV/lib/python3.5/site-packages/django/db/models/base.py", line 762, in save
    "unsaved related object '%s'." % field.name ValueError: save() prohibited to prevent data loss due to unsaved related object 'contest_of_ABC'.

1 Ответ

1 голос
/ 04 июня 2019

Вы захотите вызвать super.save () для вашего MatchDetail до того, как создадите свой объект ContestDetail, а не после того, как он у вас есть. Пока не вызывается super, ваш собственный объект не имеет первичного ключа (при условии сохранения нового объекта)

def save(self, *args, **kwargs):
    self.match_tick = self.match_date.timestamp()
    super(MatchDetail, self).save(*args, **kwargs)

    contest_obj_1 = ContestDetail(
                            contest_of_ABC=self,
                            contest_name="₹1000 Winnnings",
                            filled_status = False,
                        )
    contest_obj_1.save()
...