更新模型数据以匹配列表

时间:2019-02-13 15:53:30

标签: python django

背景:我正在从API中提取数据并创建一个类似于以下内容的列表。现在,此数据集每次将有50个条目,并且几乎每次将数据保存到模型中时都会更改。所以下面我创建了我的Django项目中发生的事情的压缩版本。同样使用djangos ORM,模型数据也被放入外部postgres数据库中。

我使用如下列表将数据插入模型:

   list = [(1, "open", "hello"), (2, "closed", "hey"), (3, "in progress", "never"), (4, "open", "free")]

然后将这些值保存到模型“ Bug”中

    for item in list:
        b = Bug(key=item[0],
                status=item[1],
                description=item[2])
        b.save()

现在说列表更改为此

list = [(3, "closed", "never"), (4, "closed", "free"), (5, "open", "never"), (6, "open", "great")]

(请注意,将key的“ 3”条目从“进行中”更改为“已关闭”,将key的“ 4”的条目也更改为“ close” 。这还会添加key为“ 5”和“ 6”的条目)

利用第一个列表中现有的已保存模型数据,如何更新已保存的模型数据以反映第二个列表的更改?以及添加条目。

编辑:所以看来这段代码已经在执行我的预期

1 个答案:

答案 0 :(得分:2)

您可以使用update_or_create

for item in list:
    b = Bug.objects.update_or_create(
            key=item[0],
            defaults={'status': item[1], 'description': item[2]})
    )

(此后您无需致电save。)

修改

如果key已经是主键,则您无需执行任何操作-原始代码可以正常工作。 Django将更新原始项目(如果存在),否则将其插入:请参见How Django knows to UPDATE vs INSERT