在 django 中将字段从一个模型复制到另一个模型的函数



我想合并 2 个具有不同但重叠字段的不同模型。

我尝试编写一个函数,将字段及其数据从模型 A 复制到模型 B。

def create_field():
old = DetailItem.objects.all()
new = CrawlItem.objects.all()
for item in old:
c = CrawlItem.objects.get(title=item.title, description=item.description, link=item.link, cpvcode=item.cpvcode, postalcode=item.postalcode  )
c.save()

而且我不知道错误在哪里。我想要一个包含旧模型和一些新字段的数据的模型。

这是我对这两个模型的代码:

class DetailItem(Base): 
title  = models.CharField(max_length=500)
description = models.CharField(max_length=20000)
link = models.URLField()
cpvcode = models.ManyToManyField('CPVCode',related_name='cpv')
postalcode = models.ForeignKey('PostalCode',on_delete=models.SET_NULL,null=True,blank=True,related_name='postal')
def __str__(self):
return self.title
class CrawlItem(Base):
guid = models.CharField( primary_key=True, max_length=500)
title = models.CharField(max_length=500)
link = models.URLField()
description = models.CharField(max_length=2000)
pubdate = models.DateTimeField()
detail = models.ForeignKey('DetailItem',on_delete=models.SET_NULL,null=True,blank=True,related_name='crawldetail')
def __str__(self):
return str(self.title)

这就是我想要得到的:

class CrawlItem(Base):
guid = ...
title = ...
link = ...
cpvcodes = ...
postalcode = ...
pubdate = ...
vergabestelle = ...
vergabeart = ...
anmeldefrist = ...
description = ...

任何如何到达那里的想法都非常感谢!

目前还不完全清楚数据库中已经存在哪些对象,以及何时将两个对象视为"相等"。假设当titledescriptionlink相同时,CrawlItem与"DetailItem"相等",那么您可以使用如下所示的update_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)

在 for 语句中,您只是尝试使用get查询集方法选择与 DetailItem 具有相同值的 de CrawlItem。

如果要创建爬网项,则应使用create方法(此处的文档 -> 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)

希望这有所帮助,并让您走上正确的方向。

G.

最新更新