2 回答
TA贡献1995条经验 获得超2个赞
尚不完全清楚数据库中已经存在哪些对象,以及何时认为两个对象“相等”。假设 a在和相同时与CrawlItem“DetailItem”“相等” title,那么您可以像这样使用函数:descriptionlinkupdate_or_create
for item in old:
CrawlItem.objects.update_or_create(
# if matching, existing item updated, otherwise new item created
title=item.title, description=item.description, link=item.link,
defaults = {'cpvcode': item.cpvcode, 'postalcode': item.postalcode}
)
或者,如果两个模型与模型中所示的 fk 链接(并且您想稍后将其删除),那么您甚至不需要检查“相等”对象,因为您已经拥有所有相关的对象(假设标题、描述和链接已经相等):
for item in old:
item.crawldetail.all().update(cpvcode=item.cpvcode, postalcode=item.postalcode)
TA贡献2036条经验 获得超8个赞
在您的 for 语句中,您只是尝试使用getqueryset 方法选择与 DetailItem 具有相同值的 de CrawlItem。
如果你想创建一个 CrawlItem 你应该使用该create方法(docs here -> https://docs.djangoproject.com/en/2.2/ref/models/querysets/#create)
c = CrawlItem.objects.create(title=item.title, ..., postalcode=item.postalcode)
它会在create()被调用时创建,因此,您无需保存它,c设置为新创建的对象。
出于性能原因,您可以使用bulk_create()如下方法(此处的文档-> https://docs.djangoproject.com/en/2.2/ref/models/querysets/#bulk-create)
new_crawlitems = []
for item in old:
new_crawlitems.append(CrawlItem(title=item.title, description=item.description, link=item.link, cpvcode=item.cpvcode, postalcode=item.postalcode)
CrawlItem.objects.bulk_create(new_crawlitems)
希望这会有所帮助,并使您朝着正确的方向前进。
添加回答
举报