django数据库不存在就插入存在就修改
django数据库不存在就插入存在就修改
需求
django插入数据到数据库时,需要根据条件判断,如果不存在,就插入一条新数据,如果已经存在,则修改数据的字段
解决办法
函数
使用该函数可以完成上述功能
模型.objects.update_or_create()
例如Student.objects.update_or_create
参数
defaults 表示如果存在,要更新的字段名称和对应的新的字段值
**kwargs 表示要查询的条件
- 必填,不然查询条件为空,则返回的是所有数据,会抛出异常
- 查询条件必须匹配0条或1唯条数据,0条则插入,1条则修改,否则抛异常
返回值
返回两个值,第一个是查询的条件,第二个表示是否为插入,False表示不是插入,而是修改数据,True是插入数据
例子
功能
根据student_id判断,如果存在student_id="10088"的学生,则修改学生的姓名为"存在就改名",同时修改学生的性别为0
原始的数据
代码
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()
运行后输出
第一个返回值为查询Student对象,第二个返回值表示不是插入数据,而是更新数据
运行后的数据
可以看到,10088学生存在,因此名字和性别都被改变了,同时updated自动也自动更新了
例子2
功能
根据student_id判断,如果不存在student_id="123456"的学生,则添加一条记录
原始的数据
代码
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()
运行后输出
返回True表示插入数据
运行后数据
可以看到,即使defaults没有student_id,也会自动填充student_id
PS:如果defaults有student_id,则用defaults里面的student_id