2013-12-19 14 views
5

の保存に失敗します。django-rest-frameworkのauthtokenで既存のトークンを変更するにはどうしたらいいですか?

from rest_framework.authtoken.models import Token 

token = Token.objects.get(user=user1) 
token.key = '1' 
token.save() 

IntegrityError: duplicate key value violates unique constraint "authtoken_token_user_id_key"

+0

私たちは重複したデータの理由を知っているので、私たちは、トークンテーブルの内容を表示してください.. – mariodev

+0

今すぐただ一つのトークンがあります >>> Token.objects.all() >>> [] –

答えて

4

を与え、これがうまくいくように思える:

Token.objects.filter(user=user1).update(key='1') 
+0

ありがとうございました。はい、それは動作しますが、主キーを変更します。私はそれが良い考えではないと思う。そこで私は独自のトークンモデルを作成し、新しい認証を追加しました。 –

+0

@ nmb.ten私は迷っています。何を変える必要がありますか? – mariodev

+0

@mariodevこれは素晴らしく、完璧に動作します。 – Gabriel

4

私は将来の参考のために応答を残す必要があると思ったので、今日は同じ問題を持っていましたこれがなぜ起こるのかを説明します。

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()メソッドを使用すると、トークンを手動で生成する必要があります(上で説明したように)。それはプライマリキー、キー列を変更します。あなたが最初にしたい:)

関連する問題