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')
我不希望我的站点使用整数 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')