- Web Engineer
- アウトバウンド営業
- Webエンジニア(経験者)
- Other occupations (17)
- Development
- Business
TortoiseORMでレコードの削除を行った際、Model作成時のデフォルトでfields.CASCADEが指定されているためレコード削除時に自動で子テーブルも削除してくれます。
しかし論理削除においては削除はUPDATE処理であるため、子テーブルに情報が伝播しません。
なんとかして情報を伝播させるための方法を考えてみます。
作戦1:describeメソッドから情報が取得できないか試してみる
TortoiseORMのModelクラスには情報取得用のdescribe()が用意されており、各種フィールドや外部キーの参照情報などを辞書型で取得することができます。
class Parent(Model):
id = fields.BigIntField(pk=True)
name = fields.CharField(max_length=255, unique=True)
created_at = fields.DatetimeField(null=True, auto_now_add=True)
updated_at = fields.DatetimeField(null=True, auto_now=True)
deleted_at = fields.DatetimeField(null=True, default=None)
class Child(Model):
id = fields.BigIntField(pk=True)
parent_id = fields.ForeignKeyField("models.Parent", related_name="children")
name = fields.CharField(max_length=255, unique=True)
created_at = fields.DatetimeField(null=True, auto_now_add=True)
updated_at = fields.DatetimeField(null=True, auto_now=True)
deleted_at = fields.DatetimeField(null=True, default=None)
このようなモデルの場合、
Parent.describe(False)["backward_fk_fields"]
このようにして自身を参照しているテーブルの情報を取得できます。"backward_fk_fields"が自身を参照しているテーブル、
しかし、ここで得られる情報は限定的で、今回必要な情報は得られません。
作戦2:フィールドの情報を直接探してみる
Parent.describe(False)["backward_fk_fields"]
Modelインスタンスは_metaという変数を持っており、ここからより詳細な情報を取得できます。_metaという変数名が示す通り外からの参照は想定されていない値のため注意が必要です。
_metaのfields_mapにdescribe()で整形される前のFieldクラスが格納されているので、ここから情報を取得できるか試してみます。今回必要なものは、①参照されている子テーブル②子テーブルのキー名の二点です。
まずは①を探します。fields_mapには関連するフィールド情報が沢山格納されていますが、子テーブルの参照情報を持っているのはBackwardFKRelationクラスであるため、型チェックで抽出します。
fields = [ _ for _ in Parent._meta.fields_map.values() if isinstance(_, BackwardFKRelation)]
BackwardFKRelationクラスには、field_type: "Type[MODEL]"
とrelation_field: str
という定義がされています。これらがそれぞれ子テーブルのModel、フィールド名の参照先であるようです。
これを元にTortoiseORMの処理を呼ぶことができそうです。
fields = [ _ for _ in Parent._meta.fields_map.values() if isinstance(_, BackwardFKRelation)]
for field in fields:
model = field.field_type field_name = field.relation_name await model.filter(**{ field_name: ParentのID }).update(deleted_at=datetime.now())
これで小要素の更新に使うための値を全て取得し呼ぶことができました。
再起呼び出しで孫テーブルに対応させる
…
記事の続きは下のURLをクリック!
https://rightcode.co.jp/blogs/46571
エンジニア積極採用中です!
現在、WEBエンジニア、モバイルエンジニア、デザイナー、営業などを積極採用中です!
採用ページはこちら:https://rightcode.co.jp/recruit
社員の声や社風などを知りたい方はこちら:https://rightcode.co.jp/blogs?category=life
社長と一杯飲みながらお話しませんか?(転職者向け)
特設ページはこちら: https://rightcode.co.jp/gohan-sake-president-talk
もっとワクワクしたいあなたへ
現在、ライトコードでは「WEBエンジニア」「モバイルエンジニア」「ゲームエンジニア」、「デザイナー」「WEBディレクター」「営業」などを積極採用中です!
ライトコードは技術力に定評のある受託開発をメインにしているIT企業です。
有名WEBサービスやアプリの受託開発などの企画、開発案件が目白押しの状況です。
- もっと大きなことに挑戦したい!
- エンジニアとしてもっと成長したい!
- モダンな技術に触れたい!
現状に満足していない方は、まずは、エンジニアとしても第一線を走り続ける弊社代表と気軽にお話してみませんか?
ネット上では、ちょっとユルそうな会社に感じると思いますが(笑)、
実は技術力に定評があり、沢山の実績を残している会社ということをお伝えしたいと思っております。
- ライトコードの魅力を知っていただきたい!
- 社風や文化なども知っていただきたい!
- 技術に対して熱意のある方に入社していただきたい!
一度、【Wantedly内の弊社ページ】や【コーポレートサイト】をのぞいてみてください。
【コーポレートサイト】https://rightcode.co.jp/
【採用募集】https://rightcode.co.jp/recruit(こちらからの応募がスムーズ)
【wantedlyぺージ】https://www.wantedly.com/companies/rightcode