首页 > 解决方案 > 如果行存在,Django 更新行

问题描述

我有一个模特说,

class ABC(models.Model):
    x = models.CharFeild(max_length=100)
    y = model.IntegerFeild(default=1)

另一个模型是,

class XYZ(models.Model):
        a = models.CharFeild(max_length=100)
        abc = model.ForeignKey(ABC, db_index=True)

我现有的数据库看起来像,

ABC
id x  y
1  a  10
2  b  20
3  c  30
.   .  .
.   .   .

XYZ
id  a  abc_id
1   x  1
2   y  2
3   z  3
.   .  . 
.   .  .

所以现在我想更新该字段,如果它存在于模型 XYZ 中,即更改 abc_id=1 或 2 或 3 的列“a”值,如果该 abc_id 不存在,则创建一个新行。

标签: pythonmysqldjangodjango-modelsdjango-queryset

解决方案


update_or_create()QuerySet的使用方法

new_value = {"a": "new value"}

XYZ.objects.update_or_create(abc_id=1,defaults=new_value)

注意:我不确定是否可以使用该方法 添加逻辑或条件update_or_create()


更新
这也可以通过,

defaults = {"a": "new value"}
try:
    obj = XYZ.objects.get(abc_id=1)
    for key, value in defaults.items():
        setattr(obj, key, value)
    obj.save()
except XYZ.DoesNotExist:
    new_values = {"abc_id": 1}
    new_values.update(defaults)
    obj = XYZ(**new_values)
    obj.save()

推荐阅读