Django 2.x UUID 字段的主键

Django 2.x Primary-Key to UUID field

我不希望我的站点使用整数 ID 作为主键,因为它们很容易通过 simyply 执行 i+1 来确定 相反,我想为此使用 UUID 字段。所以我开始在我的所有模型上添加一个 UUIDField 作为 id 字段,如下所示:

class User(AbstractBaseUser):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
...

但自从我这样做后,我得到了如下错误:

Reverse for 'profile' with keyword arguments '{'pk': UUID('68065cdb-c611-4865-bffc-32e00421bef1')}' not found. 1 pattern(s) tried: ['user/(?P\d+)/profile$']

我的 urls.py 看起来像:

url(r'^user/(?P<pk>\d+)/profile$', auth_required(app.view_profile_external), name='profile'),

template.html:

....
<div>
   <a href="{% url 'profile' pk=user.pk %}">My Profile</a>
</div>
....

views.py

def view_profile_external(request, pk=None):
    if pk:
        user = get_user_model().objects.get(pk=pk)
    else:
        user = request.user
    args = {'external_user': user}
    return render(request, 'app/profile_as_external.html', args)

我这里也需要改变什么吗?我不明白为什么 UUIDField 不能像 Integer 字段一样解析为 pk 或 django 默认提供的 id。

您可以使用 uuid path converter:

在 uuid 上反转
path('user/<uuid:pk>/profile$', auth_required(app.view_profile_external), name='profile'),

或者如果您使用的是 Django 1.11:

r_uuid = r'[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}'

url(r'^user/(?P<pk>%s)/profile$' % r_uuid, auth_required(app.view_profile_external), name='profile')