【问题标题】:Django bulk_create causes duplicate entry integrity errorDjango bulk_create 导致重复条目完整性错误
【发布时间】:2017-05-26 18:47:49
【问题描述】:

我有以下型号:

class GeneratedContent(models.Model):
    entity = models.ForeignKey('companies.Entity')
    source_url = models.URLField(max_length=255)
    title = models.CharField(max_length=255, blank=True, null=True)
    desc = models.TextField(blank=True, null=True)
    created_at = models.DateTimeField(auto_now_add = True)
    updated_at = models.DateTimeField(auto_now = True)

    def __str__(self):  
        return self.entity.name +' Content'

然后我正在处理一些 url,然后像这样保存大量这些对象:

gen_content_list = []
        for e in entities:
            entity_status = get_tweets(e.twitter_handle())

            try:
                stat_url = re.search("(?P<url>https?://[^\s]+)", entity_status).group("url")
                gen_content = GeneratedContent.objects.create(
                    entity=e,
                    desc=entity_status,
                    source_url=stat_url,
                    crawled=False,
                    )
                gen_content_list.append(gen_content)
                self.stdout.write(self.style.SUCCESS(e.name+' status: '+stat_url.encode('ascii','replace')))
            except:
                pass
        if gen_content_list:
            GeneratedContent.objects.bulk_create(gen_content_list)

我收到以下错误:

django.db.utils.IntegrityError: (1062, "重复的条目 '19' 的键 '初级'")

我做错了什么?

【问题讨论】:

    标签: python django django-models django-orm


    【解决方案1】:

    问题是您调用create()(它在数据库中创建实例)然后尝试执行bulk_create()。相反,创建一个未保存的模型实例:

    gen_content = GeneratedContent(...)
    

    【讨论】:

      【解决方案2】:

      要为批量创建准备实例,您需要编写

      GeneratedContent(
                      entity=e,
                      desc=entity_status,
                      source_url=stat_url,
                      crawled=False,
                      )
      

      插入

      GeneratedContent.objects.create(...)    # that method send data to db immediately
      

      之后就可以调用bulk_create方法了。

      例如:

      for e in entities:
          ... 
          gen_content = GeneratedContent(
                                         entity=e,
                                         desc=entity_status,
                                         source_url=stat_url,
                                         crawled=False,
                                         )
          gen_content_list.append(gen_content)
      
      GeneratedContent.objects.bulk_create(gen_content_list)
      

      【讨论】:

        猜你喜欢
        • 2015-05-18
        • 1970-01-01
        • 2020-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多