Django抛出ValueError:save()禁止以防止由于未保存的相关对象保存方法而导致数据丢失

时间:2019-06-04 16:52:29

标签: python django django-models

当创建XYZ模型对象时,我试图通过XYZ模型的保存方法创建模型ABC的一些对象。请参阅以下代码以供参考:

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 个答案:

答案 0 :(得分:1)

您将要在创建ContestDetail对象之前(而不是之后)在MatchDetail上调用super.save(),因为您拥有它。在调用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()