2020/04/29

Djangoで継承している子クラスのオブジェクトを親クラスのオブジェクトから見つける

タイトルの通り.

子クラスの名前がわかってる場合は,
parent_obj.child
でアクセス可能だけど,継承している子クラスが複数あって,どのクラスのオブジェクトに対応づいているか不明な場合は,工夫がいる.
related_objects から対応付くクラスの一覧を取得して,getattrでテキストで指定してアクセスすればOK.
こういう書き方をしておくと,子クラスを増やしたときに,書き換える必要がないから楽.

コードは以下の通り.

class Parent(models.Model):
    def get_child(self):
        """継承する子クラスのオブジェクトを返す"""
        children = self._meta.related_objects  # 継承している子クラス一覧を見つける
        for c in children:
            try:
                child = getattr(self, c.name)  # テキストで指定したselfのインスタンス変数にアクセス
            except getattr(ImageDatabase, c.name).RelatedObjectDoesNotExist:  # テキストで指定したクラス変数にアクセス
                pass  # 対応するオブジェクトがなければ何もしない
        return child

class Child(ImageDatabase):
    parent = models.OneToOneField(to= Parent, related_name='relation')


でも,もっとちゃんとした方法があるかも.
誰か知ってたら教えてほしい.

0 件のコメント:

コメントを投稿