【django】update_or_create()の使い方

Django

使いやすい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を勉強する方はこちらをお勧めします。

タイトルとURLをコピーしました