私は将来の参考のために応答を残す必要があると思ったので、今日は同じ問題を持っていましたこれがなぜ起こるのかを説明します。
key
カラムは、Token
テーブルの主キーであるです。
モデルインスタンスを編集する場合、save()
を呼び出すときに、djangoはINSERT
またはUPDATE
を実行する必要があるかどうかを判断する必要があります。これは、プライマリキーを変更しただけなので、データベース内の既存の行(プライマリキーを使用)を検索して検索します。プライマリキーを見つけられず、新しい行を挿入する必要があると想定されます。すでにそのユーザーの行があり、user_id列に一意の制約があるため、挿入は失敗します。
対応する生成されたSQLの例。 save()
呼び出しがあり
SELECT (1) AS "a"
FROM "authtoken_token"
WHERE "authtoken_token"."key" = 'cafb2efb9b26912d60fc5a0a75b2b7ba0348a2ec'
LIMIT 1;
INSERT
INTO "authtoken_token" ("key", "user_id", "created")
VALUES ('cafb2efb9b26912d60fc5a0a75b2b7ba0348a2ec', 1, '2014-03-18 21:48:30.434677+00:00');
をレンダリングすることがSELECT
は、編集されたトークン(cafb2efb9b26912d60fc5a0a75b2b7ba0348a2ec)で行を探していることは明らかだと
>>> t = Token.objects.get(user=User.objects.get(id=1))
>>> t.key
u'b0750c801a1b075051ed084841f3001bb55dd1f1'
>>> t.key = t.generate_key()
'cafb2efb9b26912d60fc5a0a75b2b7ba0348a2ec'
t.save()
。
ソリューション:
私はあなただけの古いToken
インスタンスを削除し、(単一のトランザクションで)新しいものを作成することができ、この特定のケースで推測し、それは自動あなたのためのキーを生成します、のようなもの:これはORMレベルでの問題である、あなたは削除/挿入を避け、ちょうどsave()
方法で使用して、その行の値を変更することはできませんが、こと
token.delete()
Token.objects.create(user=user1)
は注意してください。
mariodevが示唆しているように、update()
メソッドを使用すると、トークンを手動で生成する必要があります(上で説明したように)。それはプライマリキー、キー列を変更します。あなたが最初にしたい:)
私たちは重複したデータの理由を知っているので、私たちは、トークンテーブルの内容を表示してください.. – mariodev
今すぐただ一つのトークンがあります >>> Token.objects.all() >>> [] –