在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()
还有另一种方法吗?
答案 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()