gpt4 book ai didi

python - 将 ManyToMany 转换为 ForeignKey (django)

转载 作者:行者123 更新时间:2023-11-29 12:17:46 24 4
gpt4 key购买 nike

我的数据库中有一个 ManyToMany 字段,我想将其转换为 ForeignKey 关系。关系已经是一对多的,所以不会有归类。

我能在 stackoverflow 上找到的最接近的问题是 this more complicated situation in a different framework/language

我简化的 django 模型如下所示。有问题的字段已经存在于数据库中,我们只需要填充 DbLocation.pattern 字段。

class DbPattern(models.Model):
locations = models.ManyToMany(DbLocation) #trying to remove this
...

class DbLocation(models.Model)
pattern = models.ForeignKey(DbPattern) #and replace it with this
...

我天真的解决方案是嵌套 for 循环。它有效,但看起来处理几百万条记录需要几天时间:

patterns = DbPattern.objects.all()
for p in patterns:
locs = p.locations # there ary many locations
for l in locs:
l.pattern = p # each location has exactly 1 pattern.

有没有一种简单的方法可以在运行速度很快的 Python/Django 或 PostreSQL 中实现它?我想有一种方法可以通过查询来做到这一点。我只需要做一次。

预先感谢您的帮助!

最佳答案

通过一些简单的调整,我设法获得了几个数量级的加速。可能会实现更多的加速,但这对我的目的来说已经足够了。

朴素代码(1000 个样本需要 793 秒)

patterns = DbPattern.objects.all()
for p in patterns:
locs = p.locations # there ary many locations
for l in locs:
l.pattern = p # each location has exactly 1 pattern.
l.save()

第一次改进(1000 个样本需要 11 秒)

patterns = DbPattern.objects.all()
for p in patterns:
locs = p.locations
locs.update(pattern=p)

第二次改进(1000个样本耗时2.5秒)

patterns = DbPattern.objects.all()
[p.locations.all().update(pattern=pattern) for p in patterns]

关于python - 将 ManyToMany 转换为 ForeignKey (django),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43597919/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com