Django如何用get_or_create实现同手机号联系人更新或新增
你这个需求可以用Django ORM内置的update_or_create方法快速实现,不需要自行编写复杂的判断逻辑,同时建议给手机号字段加唯一约束从数据库层面避免重复数据,具体修改步骤如下:
1. 修改models.py,给手机号加唯一约束
从数据库层面保证不会出现重复手机号的异常,修改后代码:
from django.db import models class Form(models.Model): name = models.CharField(max_length=30) # 新增unique=True参数,保证手机号全局唯一 phone = models.CharField(max_length=30, unique=True)
修改后执行以下迁移命令让配置生效:
python manage.py makemigrations python manage.py migrate
2. 修改views.py的提交逻辑,实现新增/更新判断
update_or_create方法的第一部分参数为查询条件(此处按手机号查询),defaults参数为查询到匹配记录时要更新的字段值,未查询到匹配记录时会自动用查询条件+defaults内容创建新记录,修改后代码:
from django.http import HttpResponse from django.shortcuts import render,redirect from django.contrib import messages from .forms import Forms from .models import Form def main(request): form = Forms() if request.method == "POST": form = Forms(request.POST) if form.is_valid(): # 从验证通过的表单中提取提交数据 phone = form.cleaned_data['phone'] name = form.cleaned_data['name'] # 核心逻辑:手机号匹配则更新,不匹配则新增 obj, created = Form.objects.update_or_create( phone=phone, defaults={'name': name} ) # 给用户返回不同的操作提示 if created: messages.success(request, '新联系人信息已提交') else: messages.success(request, '已有联系人信息已更新') return redirect('/') return render(request, 'app/main.html', { 'form':form } )
逻辑说明
update_or_create会返回两个值:第一个是操作的模型对象,第二个是布尔值,True代表本次操作为新增记录,False代表本次操作为更新已有记录- 给phone加
unique=True是可选但强烈推荐的操作,可避免并发请求时出现重复数据的问题
其余文件(forms.py、urls.py、模板文件等)无需修改,直接使用现有代码即可正常运行。
内容的提问来源于stack exchange,提问作者maria_hoffman
相关产品推荐
相关产品推荐

