2017-01-13 3 views
0

私はUsertypeを指す外部キーを持つUserモデルを持っているとします。モデルフィールドがフェッチされたかどうかを確認する方法はありますか?

Usertypeテーブルに参加しないでユーザーを取得するだけの場合は、最後にアクセスしたときにそのUsertypeを取得する追加のクエリがあります。

私の質問は、そのようなフィールドが既に埋め込まれているか、または私のアクセスがフェッチを引き起こすかどうかを確認する方法があるかどうかです。このような

何か:私はこのようにそれを行う場合

class Usertype(BaseModel): 
    name = CharField(max_length=32) 

    def serializable(self): 
     return { 
      'name': self.name 
     } 

class User(BaseModel): 
    name = CharField(max_length=32) 
    usertype = ForeignKeyField(Usertype) 

    def serializable(self): 
     ret = { 
      'name': self.name, 
     } 

     if self.usertype: 
      ret['usertype'] = self.usertype.serializable() 

     return ret 

、私の仮定は、if文はそれが起こることをフェッチ引き起こすことです。

更新:

タラスの答えから、私は、キャッシュされた関連オブジェクトを保持している、モデルの_obj_cacheプロパティがあることを把握することができました。 だから私は私が望むものを達成することができます

def serializable(self): 
    ret = { 
     'name': self.name, 
    } 

    if 'usertype' in self._obj_cache: 
     ret['usertype'] = self.usertype.serializable() 

    return ret 

しかし、これは内部フィールドをいじり、偉大なアプローチのように見えていません。

答えて

1

技術的には - はい、方法はありますが、選択する方法はありません。 私はコードを掘り下げて、データがキャッシュされている場所を見つけました。あなたは次のコードが表示されます#382ラインをチェックした場合:

# The related instance is loaded from the database and then cached in 
# the attribute defined in self.cache_name. It can also be pre-cached 
# by the forward accessor (ForwardManyToOneDescriptor). 
try: 
    rel_obj = getattr(instance, self.cache_name) 
except AttributeError: 
    related_pk = instance._get_pk_val() 

何であると言うことですが「私はそれがキャッシュに存在しない限り、データベースから値を取得するつもりです。キャッシュの名前は何ですか? - あなたの場合はu'_usertype_cache'です。ここに証拠があります: enter image description here

したがって、技術的に - はい、方法があります。あなたは本当に保護されたフィールドを使用し、独自のハックを追加したいですか?わたしは・・・しないだろう。

+0

ありがとうございました!私はそれがうまくいくかどうか、私が持っているピーウィーバージョンではっきりとはうまくいかないかどうかを確かめようとしていました。そのキャッシュを保持する各モデルに_obj_cacheディクショナリがあるようです。ですから、user._obj_cacheに "usertype"があれば "できます。" – manecosta

+0

私はそれが可愛いわけではなく、変更される可能性が高いことに同意します。 coleiferがよりサポートされたアプローチを提供できるかどうかを私は待っています。 – manecosta

関連する問題