怎么做...在Django中进行重复密钥更新...

时间:2018-11-07 19:02:01

标签: python django

在Django的ORM中是否可以执行以下操作?

INSERT INTO mytable
VALUES (1,2,3)
ON DUPLICATE KEY
UPDATE field=4

我熟悉get_or_create,它采用默认值,但是如果默认值存在差异,则不会更新记录。通常,我使用以下方法,但是需要两个查询而不是一个:

item = Item(id=1)
item.update(**fields)
item.save()

还有另一种方法吗?

2 个答案:

答案 0 :(得分:1)

  

我熟悉get_or_create,它采用默认值,但是如果默认值存在差异,则不会更新记录。

update_or_create应该提供您想要的行为。

Item.objects.update_or_create(
    id=1,
    defaults=fields,
)

它返回与(object, created)相同的get_or_create元组。

请注意,这仍将执行两个查询,但仅在记录不存在的情况下(与get_or_create一样)。如果由于某种原因这是不可接受的,您可能会被困编写原始SQL来处理此问题,这在可读性和可维护性方面是不幸的。

答案 1 :(得分:0)

我认为get_or_create()仍然是答案,但仅指定pk字段。

item, _ = Item.objects.get_or_create(id=1)
item.update(**fields)
item.save()