在 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 = ...

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


茅侃侃
浏览 141回答 2
2回答

拉风的咖菲猫

尚不完全清楚数据库中已经存在哪些对象,以及何时认为两个对象“相等”。假设 a在和相同时与CrawlItem“DetailItem”“相等” title,那么您可以像这样使用函数:descriptionlinkupdate_or_createfor 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)

慕桂英3389331

在您的 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)希望这会有所帮助,并使您朝着正确的方向前进。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python