django数据库不存在就插入存在就修改

发布时间 2023-07-31 15:00:23作者: 南风丶轻语

django数据库不存在就插入存在就修改

需求

django插入数据到数据库时,需要根据条件判断,如果不存在,就插入一条新数据,如果已经存在,则修改数据的字段

解决办法

函数

使用该函数可以完成上述功能

模型.objects.update_or_create()例如Student.objects.update_or_create

参数

image-20230731143820895

defaults 表示如果存在,要更新的字段名称和对应的新的字段值

**kwargs 表示要查询的条件

  • 必填,不然查询条件为空,则返回的是所有数据,会抛出异常
  • 查询条件必须匹配0条或1唯条数据,0条则插入,1条则修改,否则抛异常

返回值

返回两个值,第一个是查询的条件,第二个表示是否为插入,False表示不是插入,而是修改数据,True是插入数据

例子

功能

根据student_id判断,如果存在student_id="10088"的学生,则修改学生的姓名为"存在就改名",同时修改学生的性别为0

原始的数据

image-20230731143236731

代码

import os

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'tutorial.settings')
import django

django.setup()
from student_manager.models import Student


def main():
    # student_id
    # student_name
    # student_sex
    # student_birthday
    defaults = {"student_name": "存在就改名", "student_sex": 0}
    ret = Student.objects.update_or_create(defaults, student_id="10088")
    print(f"ret:{ret}")


if __name__ == '__main__':
    main()

运行后输出

image-20230731143540237

第一个返回值为查询Student对象,第二个返回值表示不是插入数据,而是更新数据

运行后的数据

image-20230731143616208

可以看到,10088学生存在,因此名字和性别都被改变了,同时updated自动也自动更新了

例子2

功能

根据student_id判断,如果不存在student_id="123456"的学生,则添加一条记录

原始的数据

image-20230731144907080

代码

import datetime
import os

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'tutorial.settings')
import django

django.setup()
from student_manager.models import Student


def main():
    # student_id
    # student_name
    # student_sex
    # student_birthday
    defaults = {"student_name": "存在就改名", "student_sex": 0, "student_birthday": datetime.datetime.now()}
    ret = Student.objects.update_or_create(defaults, student_id="123456")
    print(f"ret:{ret}")


if __name__ == '__main__':
    main()

运行后输出

image-20230731144655251

返回True表示插入数据

运行后数据

image-20230731144930548

可以看到,即使defaults没有student_id,也会自动填充student_id

PS:如果defaults有student_id,则用defaults里面的student_id