3 回答

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超6個贊
盡管我喜歡 Alexander Kononenko 的回答(我不知道 slugfield,感謝您指出這一點(diǎn)),但使用非常簡單的方法可能仍然值得:
import base64
partnr='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 URL
partnrb=base64.b32decode('{}{}'.format(partobf, '='*(8-len(partobf)%8))).decode('utf-8')
print(partnrb)
輸出:
GIZQ
23
這適用于任何字符串(不僅是數(shù)字),而且很容易可逆。除了 Base32,您還可以使用 Base64 或任何其他使用與 URL 兼容的字符的編碼。使用此方法,您可以將任何 ID 從明文轉(zhuǎn)換為模糊文本,而無需字典,其中存儲了兩個值。
但是,重要的是要指出,這些(以及到目前為止線程中存在的其他答案)都與加密無關(guān)。因此,OP 可能應(yīng)該更改標(biāo)題。

TA貢獻(xiàn)1808條經(jīng)驗(yàn) 獲得超4個贊
可能您可以使用UUIDField,它可以用作唯一標(biāo)識。您可以UUIDField像這樣添加模型:
import uuid
class Product(models.Model):
unique_id = models.UUIDField(default=uuid.uuid4, unique=True, editable=False)
并將其與 url 一起使用,如下所示:
# url
path('product/<uuid:unique_id>', views.product, name='product')
# view
def product(request, unique_id):
product = get_object_or_404(Product, unique_id=unique_id)
此外,您可以用UUIDField作主鍵,因?yàn)椋▉碜晕臋n):
通用唯一標(biāo)識符是用于 primary_key 的 AutoField 的一個很好的替代方案。數(shù)據(jù)庫不會為你生成 UUID,所以建議使用默認(rèn)值:
添加回答
舉報