-
海绵宝宝撒
可能您需要 slug 字段:https ://docs.djangoproject.com/en/2.2/ref/models/fields/#slugfield 它完全符合您的要求。
-
30秒到达战场
尽管我喜欢 Alexander Kononenko 的回答(我不知道 slugfield,感谢您指出这一点),但使用非常简单的方法可能仍然值得:import base64partnr='23'partobf=base64.b32encode((bytes(partnr, 'utf-8'))).decode('utf-8').replace('=', '')print(partobf)# reverse it, if you need to deduce a part number from a given URLpartnrb=base64.b32decode('{}{}'.format(partobf, '='*(8-len(partobf)%8))).decode('utf-8') print(partnrb)输出:GIZQ23这适用于任何字符串(不仅是数字),而且很容易可逆。除了 Base32,您还可以使用 Base64 或任何其他使用与 URL 兼容的字符的编码。使用此方法,您可以将任何 ID 从明文转换为模糊文本,而无需字典,其中存储了两个值。但是,重要的是要指出,这些(以及到目前为止线程中存在的其他答案)都与加密无关。因此,OP 可能应该更改标题。
-
炎炎设计
可能您可以使用UUIDField,它可以用作唯一标识。您可以UUIDField像这样添加模型:import uuidclass Product(models.Model): unique_id = models.UUIDField(default=uuid.uuid4, unique=True, editable=False)并将其与 url 一起使用,如下所示:# urlpath('product/<uuid:unique_id>', views.product, name='product')# viewdef product(request, unique_id): product = get_object_or_404(Product, unique_id=unique_id)此外,您可以用UUIDField作主键,因为(来自文档):通用唯一标识符是用于 primary_key 的 AutoField 的一个很好的替代方案。数据库不会为你生成 UUID,所以建议使用默认值: