You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 10:06:04