私はvalue_list
と面白い経験があり、なぜこのように動作しているのかわかりません。values_list djangoはどのように機能しますか?
TestObject
の値をvalue_1
〜value_2
に、値2を値1に更新したいとします。値がTestObject
のvalue_1
とvalue_2
には、値に対する外部キーがあります。
これは私のコードです:私はTestObjectでテスト
def _swap(value_1, value_2):
from_values_ids = TestObject.objects.filter(value=value_1).values_list('id', flat=True)
to_values_ids = TestObject.objects.filter(value=value_2).values_list('id', flat=True)
TestObject.objects.filter(id__in=from_values_ids).update(value=value_2)
TestObject.objects.filter(id__in=to_values_ids).update(value=value_1)
はvalue_1
を持っていますが、任意のvalue_2
を持っていません。 この関数を実行した後、最終結果は何も起こりませんでした。調査した後、私はTestObjectが実行した後value_2
に更新されましたが見つかりました:
TestObject.objects.filter(id__in=from_values_ids).update(value=value_2)
が、それはto_values_ids
は私がprint to_values_id
を追加した理由で遅延ロードを持っているかもしれ思っ
TestObject.objects.filter(id__in=to_values_ids).update(value=value_1)
を実行した後に戻りました。
def _swap(value_1, value_2):
from_values_ids = TestObject.objects.filter(value=value_1).values_list('id', flat=True)
to_values_ids = TestObject.objects.filter(value=value_2).values_list('id', flat=True)
print to_values_ids
TestObject.objects.filter(id__in=from_values_ids).update(value=value_2)
TestObject.objects.filter(id__in=to_values_ids).update(value=value_1)
しかし、私は同じ結果を得ました。 to_values_ids
の私のプリントは[]
ですが。
私はそれを修正する方法で、IDで新しいリストを作成しましたが、それはまだ機能しましたが、コアPythonを理解する必要があります。良い説明。
両方を印刷してみてください。あなたの 'to_values_ids = []'があなたが何かを更新していないことを意味するならば! –
2つの更新が空になる前のリストto_values_idsは、TestObject.objects.filter(id__in = from_values_ids).update(value = value_2)を実行した後に変更されました。なぜそれが起こったのですか? – amm
'QuerySets'は参照ではなく値として返されるので、起こってはいけません... –