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()でやりようは色々ありそうなので、どっちでもいいのではないかと思いました。
ここまでお読みいただきありがとうございました!!
参考
この記事が気に入ったらサポートをしてみませんか?