Python Django save方法调用了两次?

Python 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 "

我试图重写save方法,以便在创建一个模型时,创建第二个模型的实例。但是,我尝试创建的第二个模型(本例中为餐厅)似乎被创建了两次。为什么呢

models.py

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
修复了它,因为它强化了原子性。