Django get_or_create()正在创建具有相同id的多个行

时间:2016-07-26 14:42:23

标签: python django python-2.7 postgresql django-models

我的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)

干杯

1 个答案:

答案 0 :(得分:2)

docs中所述,您需要一个唯一的索引才能使get_or_create正常工作

  

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

所以你上课需要

class SearchRequest(models.Model):
    class Meta:
        unique_together('quote','salesperson')

应放在字段定义之后。