gpt4 book ai didi

python - 在 Django ORM 中插入数据时跳过值以避免重复错误

转载 作者:行者123 更新时间:2023-12-01 07:28:55 26 4
gpt4 key购买 nike

我的表有一个使用“唯一一起”的复合键,如下所示

class ComponentMap(models.Model):
key = models.TextField()
component = models.TextField()

class Meta:
unique_together = [['key', 'component']]
db_table = 'component_map'

如您所见,它连接到我的 postgres 表“component_map”

现在,此表可帮助确定 key 是否有多个与其关联的组件。

由于有数千个不同的 key ,每当有人搜索某个 key 时,它都会从单独的 API 中获取所有数据,然后将其存储到我的数据库中,以确保数据存在。

我遇到的问题是,有时每当有人搜索数据库中已有的特定键以查看其组件时,都会给出错误重复键值违反唯一约束

通常在 Django 模型中,如果存在重复的键,它只会更新行,但唯一在一起似乎破坏了该功能。

我尝试过的是:

def insert_data(self, data):
values = list((item['key'],

item['name'],

list((x['components])for x in item['components']),

) for item in data['issues'])

for bug in values:
for x in bug[0]:
if ComponentMap.objects.filter(key = x):
continue
for x in bug[2]:
c = ComponentMap(key=bug[0],
component=x
)
c.save()

所以我想我可以使用继续来跳过模型中已经存在的那些键,但这似乎不起作用或者我没有正确使用它。

如有任何帮助,我们将不胜感激!

编辑:为什么这不起作用:

for bug in values:
if ComponentMap.objects.filter(key = bug[0]).exists():
continue
for x in bug[2]:
c = ComponentMap(key=bug[0],
component=x,
type="Story")

最佳答案

迭代不正确,通过使用 for x in bug[0] 您将迭代 key 本身,并且字符串是可迭代的:您将迭代覆盖键的字符

您可能想插入如下内容:

def insert_data(self, data):
for item in data['issues']:
if not ComponentMap.objects.filter(key=<b>item['key']</b>).exists():
for x in item['components']:
c = ComponentMap.objects.create(key=key, component=x)

我们可以通过对每个键使用“批量插入”来轻松减少插入次数:

def insert_data(self, data):
for item in data['issues']:
key = item['key']
if not ComponentMap.objects.filter(key=key).exists():
ComponentMap.objects.<b>bulk_create(</b>
[ComponentMap(key=key, component=x) for x in item['components']]
<b>)</b>

或者我们可以先准备一个 ComponentMap 对象列表,然后进行批量插入,例如:

def insert_data(self, data):
keys = set(ComponentMap.objects.values_list('key', flat=True))
objs = [
ComponentMap(key=item['key'], component=x)
for item in data['issues']
if item['key'] not in keys
for x in item['components']
]
ComponentMap.objects.bulk_create(objs)

最后一个将导致两次 ORM 调用。如果组件数量不是那么大,则需要两次查询。如果组件数量较多,则需要更多查询,但仍然相当有限。

关于python - 在 Django ORM 中插入数据时跳过值以避免重复错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57312681/

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