Django bulk_create导致重复的条目完整性错误

时间:2017-05-26 18:47:49

标签: python django django-models django-orm

我有以下型号:

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'

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

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,&#34;复制条目&#39; 19&#39;表示密钥   &#39; PRIMARY&#39;&#34)

我做错了什么?

2 个答案:

答案 0 :(得分:1)

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

gen_content = GeneratedContent(...)

答案 1 :(得分:0)

要准备实例以进行批量创建,您需要编写

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)