我的django应用程序中有一个get_or_create(),它创建了重复的行并为它们分配了相同的ID。
stock_search, created = SearchRequest.objects.get_or_create(quote=quote, salesperson=user)
count()不会多次计算这些行,但我在数据上运行的任何查询都会返回重复的行。
任何想法可能导致这种情况发生?
模型定义
class SearchRequest(models.Model):
salesperson = models.ForeignKey(User, blank=True, null=True, related_name='sales')
purchaser = models.ManyToManyField(User, blank=True, null=True, related_name='purchaser')
datesent = models.DateTimeField(auto_now_add=False, verbose_name=("Date Sent"), blank=True, null=True)
notes = models.TextField(default='', blank=True, null=True)
full_search = models.BooleanField(verbose_name=("Full Search"), blank=True, default=False)
quote = models.ForeignKey('Quote.Quote', blank=True, null=True)
lead_time = models.ForeignKey('Logistics.LeadTime', blank=True, null=True)
call_list = models.BooleanField(verbose_name=("Call List"), blank=True, default=False)
email_list = models.BooleanField(verbose_name=("Email List"), blank=True, default=False)
accepted = models.ForeignKey(User, blank=True, null=True, related_name='search_accepted')
dateaccepted = models.DateTimeField(auto_now_add=False, verbose_name=("Date Accepted"), blank=True, null=True)
干杯
答案 0 :(得分:2)
如docs中所述,您需要一个唯一的索引才能使get_or_create正常工作
这个方法是原子假设正确使用,正确的数据库 配置和底层数据库的正确行为。 但是,如果未在数据库级别强制执行唯一性 在get_or_create调用中使用的kwargs(请参阅unique或unique_together), 这种方法容易出现竞争条件,可能导致多重竞争 同时插入具有相同参数的行。
所以你上课需要
class SearchRequest(models.Model):
class Meta:
unique_together('quote','salesperson')
应放在字段定义之后。