这里的诀窍是知道Token
使用自定义save()
方法来生成唯一token.key
但自定义save()
方法不在迁移中运行。因此,第一个令牌将有一个空白键,而第二个令牌将失败,IntegrityError
因为它们的键也是空白且不唯一。
相反,将generate_key()
代码复制到您的迁移中,如下所示:
# Generated with `manage.py makemigrations --empty YOUR-APP`.
import binascii
import os
from django.db import migrations
# Copied from rest_framework/authtoken/models.py.
def generate_key():
return binascii.hexlify(os.urandom(20)).decode()
def create_tokens(apps, schema_editor):
User = apps.get_model('auth', 'User')
Token = apps.get_model('authtoken', 'Token')
for user in User.objects.filter(auth_token__isnull=True):
token, _ = Token.objects.get_or_create(user=user, key=generate_key())
class Migration(migrations.Migration):
dependencies = [
('YOUR-APP', 'YOUR-PREVIOUS-MIGRATION'),
]
operations = [
migrations.RunPython(create_tokens),
]
您应该避免将rest_framework
代码直接导入迁移中,否则有一天您的迁移将无法运行,因为您决定删除 rest_framework 或更改库的接口。迁移需要及时冻结。