gpt4 book ai didi

python - Django 加载对象以防唯一键重复

转载 作者:行者123 更新时间:2023-12-01 05:43:52 24 4
gpt4 key购买 nike

我有以下模型:

class Car(models.Model):
id = models.AutoField(primary_key=True)
slug = models.CharField(max_length=128L, unique=True, blank=True)
name = models.CharField(max_length=128L, blank=True)
model_slug = models.CharField(max_length=128L, unique=True, blank=True)
...

每当我从 XML 文件获取汽车列表时,其中一些会多次出现
(使用相同的 slug),如果我尝试保存它,我会得到
IntegrityError(1062, "Duplicate Entry 'car-slug' for key 'slug'")

我希望它加载现有的汽车(或更新它,以更容易的为准),以防出现重复错误。
但我希望它足够通用,以便它适用于 model_slug (或任何生成该错误的唯一字段)。

最佳答案

您需要get_or_create :

car,created = Car.objects.get_or_create(slug='car-slug')
if created:
print 'New car was created'
car.slug = 'new-car-slug'
else:
# do whatever needs to be done here
# with the existing car object, which will
# be car
# car.name = 'new name'

car.save()

无论您向 get_or_create 提供什么参数,它都会使用这些参数来搜索模型的现有记录。

<小时/>

假设您不知道什么字段组合会触发重复。最简单的方法是找出模型中的哪些字段具有该限制(即 unique=True)。您可以从模型中内省(introspection)此信息,或者更简单的方法是将这些字段简单地传递给 get_or_create

第一步是在 XML 字段和模型字段之间创建映射:

xml_lookup = {}
xml_lookup = {'CAR-SLUG': 'slug'} # etc. etc.

如果需要,您可以填充所有字段,但我的建议是仅填充那些具有唯一约束的字段。

接下来,在解析 XML 时,为每条记录填充一个字典,映射每个字段:

for row in xml_file:
lookup_dict = {}
lookup_dict[xml_lookup[row['tag']] = row['value'] # Or something similar
car, created = Car.objects.get_or_create(**lookup_dict)
if created:
# Nothing matched, a new record was created
# Any any logic you need here
else:
# Existing record matched the search parameters
# Change/update whatever field to prevent the IntegrityError
car.model_slug = row['MODEL_SLUG']
# Set/update fields as required
car.save() # Save the modified object

关于python - Django 加载对象以防唯一键重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16757781/

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