見出し画像

Django_あるモデルを引数に受け取って処理するクラスから、そのモデルを逆引きする #289日目

【一言日記】
これから美味しいもの食べます!!


少し特殊な処理ですが、方法をメモしておきます。

Djangoで開発をしていると、モデルを受け取って処理をする様々なクラスを作成することになると思います。かつ、場合によってはそのクラスで今使っているモデルに逆引きでアクセスしたいケースも出てきます。

例えば生徒を表すStudentsというモデルがあり、それを進級可否を判断するPromotionDecisionというクラスに渡しているとします。さらにそれを全体の進級率を出すPromotionDecisionRateというクラスで使っていて、PromotionDecisionRateクラスでStudentsモデルの情報を扱いたいな、となった時などです。

大まかに以下のイメージです。

# 生徒の情報が入ったモデル
class Students(models.Model):
    class = 
    name = 
    score = 
    ~フィールド色々~

 
# 生徒の進級可否を判断するクラス
class PromotionDecision():
    class Meta():
        model = Students
    ~処理色々~
 
 
# 進級率を算出するクラス
class PromotionDecisionRate():
    このクラスのどこかで以下を呼び出す
    student = Students.object.get(抽出条件)
    promotion_decision = PromotionDecision(student)

上記のような構成の時に、PromotionDecisionRateクラスで、その時PromotionDecisionクラスで処理しているstudentの情報にアクセスしたい場合、以下のように実装できます。

# 生徒の情報が入ったモデル
class Students(models.Model):
    class = 
    name = 
    score = 
    ~フィールド色々~

 
# 生徒の進級可否の情報を付与して返すクラス
class PromotionDecision(student):
    class Meta():
        model = Students

    # その時処理しているstudent(Studentsクラスから渡される)を変数に入れてアクセスできるようにする
    def __init__(self, instance):
        self.instance = instance
    ~処理色々~

    return student
 
 
# 進級率を算出するクラス
class PromotionDecisionRate():
    # このクラスのどこかで以下を呼び出す
    students = Students.object.filter(抽出条件)
    for student in students:
        promotion_decision = PromotionDecision(student)
        # PromotionDecison経由でStudentsモデルにアクセスできる
        student_instance = promotion_decision.instance
    

サンプルの作り方が下手で恐縮です。見ての通り、for文のstudentとstudent_instanceを同じものになるので、この場合はわざわざ「.instance」で呼び出す必要は全くありません。

ただ、実際はstudentの情報がすぐにアクセスできない場合もあるので、その時はこのようにして繋げることができる、というメモでした。


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


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