Python Django save方法调用了两次?
我试图重写save方法,以便在创建一个模型时,创建第二个模型的实例。但是,我尝试创建的第二个模型(本例中为餐厅)似乎被创建了两次。为什么呢 models.pyPython Django save方法调用了两次?,python,django,Python,Django,我试图重写save方法,以便在创建一个模型时,创建第二个模型的实例。但是,我尝试创建的第二个模型(本例中为餐厅)似乎被创建了两次。为什么呢 models.py class Place(models.Model): name = models.CharField(max_length=50) address = models.CharField(max_length=80) def __str__(self): return "
class Place(models.Model):
name = models.CharField(max_length=50)
address = models.CharField(max_length=80)
def __str__(self):
return "%s the place" % self.name
def save(self, *args, **kwargs):
super(Place, self).save(*args, **kwargs)
if Restaurant.objects.filter(place=self).count() == 0:
restaurant = Restaurant.objects.create(place=self)
class Restaurant(models.Model):
place = models.OneToOneField(
Place,
on_delete=models.CASCADE,
primary_key=True,
)
保存方法没有正确的缩进。我认为这是剪切和粘贴中的错误。用那种方法
if Restaurant.objects.filter(place=self).count() == 0:
restaurant = Restaurant.objects.create(restaurant=self)
这本质上就是原子的作用
假设使用正确,数据库正确,此方法是原子的
配置,以及基础数据库的正确行为。
但是,如果没有在数据库级别为
在get_或_create调用中使用的KWARG(一起查看unique或unique_),
此方法容易出现竞争条件,从而导致多个
同时插入具有相同参数的行
当然,您可以在自己的代码中使用原子块执行相同的操作,但为什么要麻烦呢。照办
Restaurent.objects.get_or_create(place=self)
这不是你保存方法中的place=self
而不是restarent=self
吗?你可以试试:
obj.save(commit=False)
#change fields
obj.save()
首先,您将创建save“instance”,执行您必须执行的操作,然后调用正确的
save()
方法。能否显示您的视图
代码?谢谢,是的,有一些缩进错误和错误的参数。太棒了,看起来使用get\u或\u create
修复了它,因为它强化了原子性。