Django的无侵入式hashids库
项目描述
Django Hashids
django-hashids是一个简单且无侵入的Django hashids库。它作为模型字段使用,但不会接触数据库或更改模型。
特性
- 代理内部模型
pk
字段,但不在数据库中存储该值。 - 允许通过hashid字符串进行查找和过滤。
- 可以用作排序键
- 可以全局指定盐、最小长度和字母表
- 支持按字段指定自定义盐、最小长度和字母表
- 支持Django REST Framework序列化器
- 当在搜索字段中指定字段时,支持Django Admin中的精确ID搜索。
- 支持常见的过滤查找,如 __iexact、__contains、__icontains,但匹配与 __exact 相同。
- 支持其他查找:isnull、gt、gte、lt 和 lte。
安装
pip install django-hashids
django-hashids
与Django 1.11、2.2、3.0、3.1、3.2、4.0以及python 3.6、3.7、3.8、3.9、3.10进行了测试。
使用方法
将HashidsField
添加到任何模型中
from django_hashids import HashidsField
class TestModel(Model):
hashid = HashidsField(real_field_name="id")
TestModel.hashid
字段将代理TestModel.id
字段,但所有查询都将返回和接收hashids字符串。TestModel.id
将按以前的方式工作。
示例
instance = TestModel.objects.create()
instance2 = TestModel.objects.create()
instance.id # 1
instance2.id # 2
# Allows access to the field
instance.hashid # '1Z'
instance2.hashid # '4x'
# Allows querying by the field
TestModel.objects.get(hashid="1Z")
TestModel.objects.filter(hashid="1Z")
TestModel.objects.filter(hashid__in=["1Z", "4x"])
TestModel.objects.filter(hashid__gt="1Z") # same as id__gt=1, would return instance 2
# Allows usage in queryset.values
TestModel.objects.values_list("hashid", flat=True) # ["1Z", "4x"]
TestModel.objects.filter(hashid__in=TestModel.objects.values("hashid"))
配置
以下属性可以添加到设置文件中,以设置HashidsField
的默认参数
DJANGO_HASHIDS_SALT
:默认盐DJANGO_HASHIDS_MIN_LENGTH
:默认最小长度DJANGO_HASHIDS_ALPHABET
:默认字母表
HashidsField
不需要任何参数,但可以提供以下参数来修改其行为。
名称 | 描述 |
---|---|
real_field_name |
代理字段名称 |
hashids_instance |
用于该字段的编码/解码的 hashids 实例 |
salt |
用于生成 hashids 的盐 |
min_length |
为该字段生成的 hashids 的最小长度 |
alphabet |
用于生成 hashids 的字母表 |
参数 hashids_instance
与 salt
、min_length
和 alphabet
互斥。有关参数的更多信息,请参阅 hashids-python。
支持一些常见的模型参数,如 verbose_name
。