見出し画像

Django_ForeignKeyのデータを更新 / save()とcreate()の違い #225日目

本日、ここ1-2週間ほどWebツールの機能修正に挑戦していたのですが、(ローカル環境で)遂にそれが修正完了しました…!週明けにプルリクを出すので手戻りがあるかもしれませんが、実務のWebツールで、狙った通りの挙動ができたので何だか嬉しかったです。

ただ実際は、コードの修正自体は30-40分程度のもので、エラーを起こしている箇所の特定の方が大変でした(最終的に自力ではできなかったです)。

このエラー特定の流れについては、少し時間を使ってまとめたいと思います。


本日はコードを修正する際に使った、DjangoのForeignkey周りの使い方を整理します。


Modelのデータを更新する

Modelのデータを更新するにはsave()かcreate()を使います。
以下のモデルがあったとします。

[aaa.py]
class Member(models.Model):
    name = models.CharField(max_length=255, blank=False)
    address = models.CharField(max_length=255, blank=False)

以下のコードで、このモデルに対してデータを挿入できます。

from aaa import Member
 
# save()の場合
new_member = Member(name='YM', address='東京都')
new_member.save()
 
# create()の場合
Member.object.create(name='YM', address='東京都')


Foreignkeyの場合のデータ更新方法

モデルの中にForeignkeyがある場合は、参照先のモデルを使って、対象とするフィールドに適した型のオブジェクトを入力すればOKです。

以下のCompanyモデルを更新してみます。

[aaa.py]
class Company(models.Model):
    name = models.CharField(max_length=255, blank=False)
    member = models.ForeignKey('Member', on.delete=models.CASCADE, related_name='company')

class Member(models.Model):
    name = models.CharField(max_length=255, blank=False)
    address = models.CharField(max_length=255, blank=False)
from aaa import Company, Member

# save()の場合
company_member = Member.object.get(name='YM')
new_company = Company(name='XXXX株式会社', member=company_member)
new_company.save()
 
# create()の場合
company_member = Member.object.get(name='YM')
Company.objects.create(name='XXXX株式会社', member=company_member)

つまりはMemberモデルがForeignkeyで紐づいている場合、Memberモデルの方でオブジェクトを作ればOK、というイメージです。


save()とcreate()の違い

上記で使い分けてみましたが、save()とcreate()はどちらもデータベースを更新してくれるメソッドです。正式には“Model.objects.create()” と “Model.save()“になります。

ほぼ同じ機能ですが、save()は保存用のオブジェクトを一度作ってから、そのオブジェクトをsaveしています。一方でcreate()はオブジェクト作成から保存までを一気に行っています。

create()の方がコード量を減らすことが出来ますが、オブジェクトに対して処理を施してから保存したい場合などはsave()が使えます。

まぁ、その場合でもcreate()でやりようは色々ありそうなので、どっちでもいいのではないかと思いました。


ここまでお読みいただきありがとうございました!!


参考


この記事が気に入ったらサポートをしてみませんか?