我有以下型号:
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)
我做错了什么?
答案 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)