【问题标题】:Django get_or_create() is creating multiple rows with the same idDjango get_or_create() 正在创建具有相同 id 的多行
【发布时间】:2016-11-30 06:51:43
【问题描述】:

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

干杯

【问题讨论】:

  • 你怎么称呼它?
  • 您需要向我们展示一些代码。我们无法凭空想象如何解决您的问题。
  • 我添加了一个代码示例,我尝试了不同的字段,得到了相同的结果。
  • 这里的信息太少,无法解决您的问题,甚至无法证明您所说的正在发生。 ID 通常是唯一的,因此您如何获得具有相同 ID 的许多行是一个谜。这意味着我们需要了解您的模型是如何设置的。如果它们唯一的并且您在查询中看到重复,我们需要查看该查询/代码以确定为什么存在重复以及是否有解决方法。有了这些小信息,我们基本上无能为力,只能说:“对不起,发生了。”
  • 您添加的模型似乎与您在获取或创建中使用的模型没有任何关系。里面没有用户

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


【解决方案1】:

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

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

所以你的班级需要

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

应该放在字段定义之后。

【讨论】:

  • 仅供参考,这是一个死链接
  • 手册页随着每个版本的发布而不断变化,它们不会保留非常旧的页面
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多