我正在尝试覆盖一个保存方法,以便在创建一个模型时,创建第二个模型的实例。但是,看起来我正在尝试创建的辅助模型(在此示例中为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,
)
答案 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%'
方法。