2017-07-11 6 views
2

この予期しない動作の変化とその実装方法の原因を理解したいと思います。予期せず変更された動作のPython変数リファレンス

:オブジェクトを移動することで、Fnを呼び出す

は、このオブジェクトが最初に新しい変数に代入されたときに異なる結果を取得します..私はJSの世界から来て、これはどのような方法で実施することは不可能である可能性が非常に高いです

>>> from core.models import SomeModel 
>>> s = SomeModel.objects.get(id=45) 
>>> s.user.profile.needs_review 
True 
>>> s.user.profile.needs_review = False 
>>> s.user.profile.needs_review 
True 
>>> profile = s.user.profile 
>>> profile.needs_review 
True 
>>> profile.needs_review = False 
>>> profile.needs_review 
False 

これは私がこれを使って作業している言語でも同様に実行されるので、これは本当に不安です。

ところで、これは普通のジャンゴモデルですが、私はそのような効果を達成するためにどのような種類の言語リソースが使用できるかを知ることにもっと興味があります。

streamer.user.profile.needs_review = True 
streamer.user.profile.save() 

そして、それは働いたが、やってませんでした:

profile = streamer.user.profile 
profile.needs_review = True 
profile.save() 
をより良い私はこのになった理由は、私が実行して profileモデルに保存定期的に行うようにしようとしていたを説明するために

はうまく機能しました。

+0

あなたの 'user'モデルを表示してください。 – Alasdair

+0

これはdjangoの標準ユーザーモデルです – enapupe

+0

フィールドを変更した後に '.save()'を実行すると変更されますか? –

答えて

1

モデルオブジェクトを変更する場合は、モデルオブジェクトを保存する必要があります。変更しないとモデルオブジェクトは反映されません。

>>> s.user.profile.needs_review = False 
>>> s.save() 
>>> s.user.profile.needs_review 
False 

>>> profile = s.user.profile 
>>> profile.needs_review 
True 

下のラインそれはあなたがこの動作を可能にするPython言語リソースについて、この動作

+0

また、同様の機能を実装する方法を理解したいと思います。 – enapupe

+0

@MartijnPieters編集ありがとう –

+1

@enapupe:何に似ていますか?トラバース、データベースデータの反映、属性の変更の検出 –

1

を参照してくださいなぜ、あなたはこれをチェックすることができますので、それがデータベースから新しいデータをロードしません:
https://docs.python.org/3/library/functions.html#property

class C: 
    def __init__(self): 
     self._x = None 

    @property 
    def x(self): 
     """I'm the 'x' property.""" 
     return self._x 

    @x.setter 
    def x(self, value): 
     self._x = value 

    @x.deleter 
    def x(self): 
     del self._x 

基本的に、djangoはこれを使ってデータベースクエリを抽象化し、あなたの例では通常のオブジェクトとして振る舞いません。

関連する問題