如何更改django rest框架的authtoken中的现有令牌?

如何更改django rest框架的authtoken中的现有令牌?,django,django-models,django-rest-framework,Django,Django Models,Django Rest Framework,保存失败: from rest_framework.authtoken.models import Token token = Token.objects.get(user=user1) token.key = '1' token.save() 给予 IntegrityError:重复的键值违反了唯一约束 “authtoken\u token\u用户\u id\u密钥” 看起来这会奏效: Token.objects.filter(user=user1).update(key='1') 我今

保存失败:

from rest_framework.authtoken.models import Token

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

IntegrityError:重复的键值违反了唯一约束 “authtoken\u token\u用户\u id\u密钥”


看起来这会奏效:

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

我今天也有同样的问题,所以我想我应该留下一个回复,以备将来参考,解释为什么会发生这种情况

令牌
表的主键

如果编辑模型实例,当调用
save()
django时,它必须确定是要执行
插入操作
还是要执行
更新操作
。它是通过在数据库中查找现有行(使用主键)来实现的,因为您刚刚更改了主键,所以它找不到它,并假定它必须插入新行。由于该用户已经有一行,并且user_id列具有唯一约束,因此插入将失败

具有相应生成的sql的示例

>>> t = Token.objects.get(user=User.objects.get(id=1))
>>> t.key
u'b0750c801a1b075051ed084841f3001bb55dd1f1'
>>> t.key = t.generate_key()
'cafb2efb9b26912d60fc5a0a75b2b7ba0348a2ec'
t.save()
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)的行

解决方案

我猜在这种特定情况下,您只需删除旧的
令牌
实例并创建一个新实例(在单个事务中),它就会自动为您生成密钥,类似于:

token.delete()
Token.objects.create(user=user1)
请注意,这是ORM级别的一个问题,您可以避免删除/插入,只需更改该行的值,而不使用
save()
方法


使用
update()
方法是一个很好的选择,正如mariodev所建议的那样,您需要手动生成令牌(如上所述),并且是的,它将更改主键、键列,但这正是您首先想要的:)

此示例代码适用于我并更新数据库中的令牌:

t = Token.objects.filter(user=user1)
new_key = t[0].generate_key()
t.update(key=new_key)

请向我们显示令牌表的内容,以便我们知道重复数据的原因。目前只有一个令牌>>>令牌.objects.all()>>>[]谢谢。是的,它可以工作,但它会更改主键。我认为这不是一个好主意。因此,我创建了自己的令牌模型并添加了新的身份验证。@nmb.ten我迷路了,您到底需要更改什么?