使いやすいQuerySetの関数 “update_or_create()” を紹介
用途としては、あるデータベースのテーブルに
既存のデータがあれば、更新します。
テーブルに何もなければ、新規追加するものです。
update_or_createの用途
使用場所としてはcreate()を使用して実行した際に、データの重複エラー
“IntegrityError at /
UNIQUE constraint failed”
が出た場合はこれを使うと便利です。
つまり、views.pyでは
Models.objects.create()
を使っていたら、こんなエラーがでる場合

update_or_create()を使います。
これはcreate()では同じidのモデルテーブルに既存のデータがあると
データを新しく作ることやデータを更新することができないです。
そのために、update_or_create()が必要になります。
update_or_createの使用例
サンプルです。このように使います。
models.py
from django.db import models
class Tasks(models.Model):
taskname = models.CharField(max_length = 50)
taskperson = models.CharField(max_length= 50)
forms.py
フォームはモデルフォームを採用しています。
from django import forms
from .models import Tasks
class TaskForm(forms.ModelForm):
class Meta:
model = Tasks
fields = {'id','taskname','taskperson'}
widgets = {
'id':forms.NumberInput(),
'taskname': forms.TextInput(),
'taskperson': forms.TextInput(),
}
labels = {
'id':'番号',
'taskname':'タスク名',
'taskperson':'担当者',
}
views.py
from django.shortcuts import render
from .models import Tasks
from .forms import TaskForm
def taskf(request):
tasklist = Tasks.objects.all()
form = TaskForm(request.POST or None)
context = {
'tasklist':tasklist,
'form':form,
}
if request.method == 'POST':
if form.is_valid():
Tasks.objects.update_or_create(id=request.POST['id'], defaults={'taskname':request.POST['taskname'], 'taskperson':request.POST['taskperson']})
return render(request,'task.html',context)
return render(request, 'task.html',context)
templates
<html lang="ja">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>tasks</title>
</head>
<body>
{% for task in tasklist %}
{{ task.id }}:{{ task.taskname }},{{ task.taskperson }}</br>
{% endfor %}
<hr/>
<form method="POST">{% csrf_token %}
<input type="number" name="id"></br>
<input type="text" name="taskname" maxlength="30"></br>
<input type="text" name="taskperson" maxlength="30">
<button type="submit">Save</button>
</form>
</body>
</html>
最後に
以上がupdate_or_create()関数でした。
お付き合いいただきありがとうございます。
類似記事(QuerySetの関数 get_or_createの使い方)

【django】モデルの get_or_create()の使い方
あまり使わないかもしれないQuerySetの関数 “get_or_create()” を紹介。用途としては、あるデータベースのテーブルに条件に合う既存のデータがあれば、取得します。テーブルに条件の合うものがなければ、新規追加するものです。
djangoをより学びたい方に以下の記事をお勧めします。
書籍でdjangoをレベル別で順序よく学びたい方におすすめの本を紹介している記事です。
また、動画で学びたい方はこちらの記事をおすすめします。
Udemyでdjangoを学ぶ際におすすめな動画教材をたった一つだけ紹介します。