のは、少しテストをやってみましょう:
>>> from django.contrib.auth.models import User
>>> u1 = User.objects.get(pk=1)
>>> u2 = User.objects.get(pk=1)
>>> u1 == u2
True
>>> u1 is u2
False
>>> u1.first_name
u'Ruth'
>>> u2.first_name
u'Ruth'
>>> u2.first_name = u"Route"
>>> u2 == u1
True
>>> u1.first_name
u'Ruth'
>>> u2.save()
>>> u1.first_name
u'Ruth'
>>>
>>> u1.refresh_from_db()
>>> u1.first_name
u'Route'
あなたが見ることができるように、二度同じレコードをロードすると、二つの異なるオブジェクト(Model
がPKで比較しているため、彼らは同じ比較)、および1つの変更を与える - あなたは、保存するかどうか変更かどうかは、2番目のものに影響しません(もちろん、データベースからリフレッシュするまで)。また、あなたは両方を変更して保存した場合、結果はあなたが期待したものではないかもしれません。
>>> u1.last_name
u'FOOBAR'
>>> u2.last_name
u'FOOBAR'
>>>
>>> u1.first_name = u"Ruth"
>>> u2.last_name = u"ROOTZ"
>>> u1.save()
>>> u2.save()
>>> ux = User.objects.get(pk=1)
>>> ux.first_name
u'Route'
>>> ux.last_name
u'ROOTZ'
あなたは、DBアクセスコストを考慮にした場合、あなたがあなたのヘルパー関数が第二をロードしたくないことは明らかと思われますdbからの(別個の)インスタンス。
非同期呼び出し(通常はセロリタスク)のケースは異なります。ここでは、オブジェクトのIDを渡して、タスクをdbから新たにロードする必要があります。主な理由は、データベース・レコードmighがタスク・コールとその実行の間で変更されていることです(また、それらの変更を上書きしたくないということです)。
DBクエリは無料でも安価でもありません。高速ですが。 –
これが同期的に行われた場合は、インスタンスを渡します。セロリタスクのような非同期呼び出しの場合、IDを渡します(IDはシリアル化可能です)。 – schwobaseggl