2016-06-17 16 views
1

関連オブジェクトのdelete()が直ちにそれを削除しないことがわかりました。私の場合、Vaderインスタンスは、instanceのシリアライザのupdateメソッドのパラメータを経由します。オブジェクトのプロパティを削除する方法(すぐに)

すぐにv.sonを削除しますか?

class Vader(models.Model): 
    pass 

class Luke(models.Model): 
    dad = models.OneToOneField(Vader, related_name='son') 

>>> v = Vader() 
>>> hasattr(v, 'son') 
False 
>>> l = Luke(dad=v) 
>>> l.save() 
>>> hasattr(v, 'son') 
True 
>>> v.son 
<Luke: Luke object> 
>>> v.son.delete() 
>>> hasattr(v, 'son') 
True 
>>> v.son 
<Luke: Luke object> 

答えて

3

データベース内の削除は直ちに実行され、それは既にロードされたモデルインスタンスに反映されません。これは通常djangoがHTTPのように動作するので問題ではありません - リクエストが入ってくると処理が行われ、状態が失われます。

あなたは、変更を確認するために、データベースから再読み込みするモデルを強制することができます。

v.refresh_from_db() 
+0

これは動作しませんでした。私は 'v = Vader.objects.get(id = v.id)'をしなければならなかった。これにOneToOne関係があるかどうか疑問に思いますか? 'refresh_from_db()'は 'Vader'テーブルだけを照会し、' .get() 'は' OneToOne'関連テーブルをすべて照会しました。 –

+0

'.delete()'の後に 'v.son'が' Luke'オブジェクトであり続けている場合、 'id'だけがNoneになります。これは '.refresh_from_db()'の後でさえこのままでした。 –

+0

私は 'hasattr(v、 'son')とv.son.id'に自分のチェックを拡大しました。これでデータベースクエリはありません。 –

関連する問題