Django保存方法调用了两次?

时间:2016-06-03 19:30:42

标签: python django

我正在尝试覆盖一个保存方法,以便在创建一个模型时,创建第二个模型的实例。但是,看起来我正在尝试创建的辅助模型(在此示例中为Restaurant)正在创建两次。那是为什么?

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,
    )

2 个答案:

答案 0 :(得分:1)

您的保存方法没有正确的缩进。我认为这是剪切和粘贴中的错误。用那种方法。

if Restaurant.objects.filter(place=self).count() == 0:
     restaurant = Restaurant.objects.create(restaurant=self)

这基本上是get_or_create所做的,但却是原子性的。

  

这个方法是原子假设正确使用,正确的数据库   配置和底层数据库的正确行为。   但是,如果未在数据库级别强制执行唯一性   在get_or_create调用中使用的kwargs(请参阅unique或unique_together),   这种方法容易出现竞争条件,可能导致多重竞争   同时插入具有相同参数的行。

你可以在自己的代码中使用原子块做同样的事情,但为什么要这么麻烦。只是做

Restaurent.objects.get_or_create(place=self)

并且不像保存方法那样place=self而不是restaurent=self

答案 1 :(得分:0)

您可以尝试:

User

首先,您将创建保存'实例',执行您必须执行的操作,然后调用正确的SELECT `COL 11`, `COL 12`, `COL 13`, SUM((`COL 11`), (`COL 12`), (`COL 13`)) FROM `samsungmobile_posts` WHERE `COL 2` LIKE '%S7%' OR '%S6%' 方法。