为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

茅侃侃 2022-05-24 15:05:56
我想合并 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.titleclass 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 = ...任何如何到达那里的想法都非常感谢!
查看完整描述

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)


查看完整回答
反对 回复 2022-05-24
?
慕桂英3389331

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)

希望这会有所帮助,并使您朝着正确的方向前进。


查看完整回答
反对 回复 2022-05-24
  • 2 回答
  • 0 关注
  • 138 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信