1. ホーム
  2. パイソン

Djangoのモデルアップデートの様々な使い方の紹介

2022-03-02 22:55:49

テーブル(モデル)の追加、削除、チェックはDjangoの開発でよく使う機能の一つですが、この記事ではモデルアップデートを使っていて遭遇したこと

モデルアップデートの一般的な使用方法

テーブルの構造が次のような場合

次に、ユーザー名とステータスを変更するには、次のいずれかを使用します。

方法1

User.objects.filter(id=1).update(username='nick',is_active=True)です。

方法2

方法1は、mysqlのステートメントと同様に、データのバッチを更新するのに適しています。 update user set username='nick' where id = 1

方法2は、1つのデータを更新するのに適しており、更新するデータが1つしかない場合に推奨されます。

auto_now属性フィールドを用いた更新

通常、テーブルには次の3つのデフォルトフィールドを追加します。

セルフインクリメント ID、これは django が既にデフォルトで追加しているもので、上のテーブル構築文のように、 username と is_active フィールドだけが書き込まれますが、テーブルが構築されると、デフォルトのセルフインクリメント ID フィールドも持つことになります

レコードがいつ作成されたかを特定する作成時刻は、auto_now_add属性を持ち、レコード作成時に自動的に現在の時刻が入力されます。

modification_timeは、このレコードが最後に変更された日時を特定するもので、auto_now属性を持ち、レコードが変更されると現在の時刻が入力されます。

以下のようなテーブル構造

テーブルにauto_now属性のフィールドがあり、自動的に更新させたい場合、上記の方法2による更新を使用しなければなりません、さもなければauto_nowフィールドは更新されません、すなわち

json/dict 型データ更新フィールド

現在、Webオープン方法の主流は、フロントとバックエンドの分離を懸念している後、共通のjson型とデータ形式のほとんどのバックエンドの相互作用は、どのように便利なコードの最小限の量でデータベースにjson形式のデータを更新するために?同じことは、次の2つのメソッドを使用して行うことができます。

方法1.

繰り返しになりますが、このメソッドは auto_now 属性を持つフィールドの値を自動的に更新するわけではありません。

通常、変数がタプル/リストであることを示すためにアスタリスク(*)を前置し、パラメータが辞書であることを示すためにアスタリスク2個を前置します。

方法2

方法 2 は、方法 1 と同様に auto_now フィールドの値を自動更新しません。

ここではdictメソッドが使用されていることに注意してください

方法3

ForeignKeyフィールドの更新

テーブルにForeignkeyの外部キーがある場合、それをどのように更新しますか?

方法1.

User.objects.filter(id=1).update(role=2)です。

これを行う最も簡単な方法は、role フィールドに id を設定することです。

もちろん、dictをパラメータとして更新することも可能です。

User.objects.filter(id=1).update(**{'username':'nick','role':3})

方法2

また、ロールにインスタンスを割り当てることもできます

もちろん、dictをパラメータとして更新することも可能です。

方法3

注:ここでのロールはオブジェクトに割り当てられている必要があります。idを書かない場合は、 "User.role" must be a "Role" instance というエラーが発生します。

また、dictをパラメータとして更新する場合、以下のコードで若干の違いがあります。

Foreignkey 外部キーは _id と一緒に追加する必要があります。

role_id の後には、ロールインスタンスではなく、id(int型またはstr型)を指定する必要があります。

ManyToManyFieldフィールドの更新

テーブル内にManyToManyFieldフィールドがある場合、それを更新するとどのような影響があるのでしょうか?

m2m update: m2mフィールドには直接の更新方法はなく、クリアと追加によってのみ更新可能です

add(): m2m フィールドに値を追加します。複数の値がある場合はリストを使用します(上記の例を参照してください)。

_t.groups.add(2)

_t.groups.add(Group.objects.get(id=2))を実行。

remove(): m2m フィールドから値を削除します。複数の値がある場合は、リストとして使用することができます(上記の例を参照してください)。

_t.groups.remove(2)

_t.groups.remove(Group.objects.get(id=2))を実行。

clear() : m2m フィールドの値をクリアします。