将所有查找表合并到一个统一的系统中。
django-lookup-tables的Python项目详细描述
django查找表
高效存储和管理应用程序中使用的查找表。
注意:此软件包正在工作(这就是为什么它还没有在版本1.0中)。我正在积极寻求贡献,以帮助使其更可用,请参见下面的"Contributing"。
重要
此软件仍处于预发行状态。从一个版本升级到下一个版本可能会在项目中造成不稳定。如果您使用过1.0.0
之前的任何版本,请阅读Release Notes for Beta Versions。
安装
安装软件包:
$ pip install django-lookup-tables
将其添加到已安装的应用程序:
INSTALLED_APPS=(...'lookup_tables',...)
用法
查找表的主要用例是创建供模型选择的用户管理的选项列表。考虑一个具有字段的模型,例如,state
:
fromdjango.dbimportmodelsfromlookup_tables.fieldsimportLookupTableItemFieldCHOICES=(('draft','draft'),('published','published'))classPost(models.Model):title=models.CharField(max_length=100)state=models.CharField(choices=CHOICES)
虽然这很容易构建,但是更改选项列表需要重新构建和重新部署应用程序。
上面的模型可以写成:
fromdjango.dbimportmodelsfromlookup_tables.modelsimportAbsractLookupTablefromlookup_tables.fieldsimportLookupFieldclassPostState(AbstractLookupTable):passclassPost(models.Model):title=models.CharField(max_length=100)state=LookupField(PostState)
这将创建一个名为PostState
的查找表,可以由人员用户管理。现在可以将此字段设置为PostState
模型中的任何值。
如果您在应用程序的admin.py
中注册了模型:
fromdjango.contribimportadminfromlookup_tables.adminimportLookupAdminfrom.modelsimportPostState@admin.register(PostState)classPostStateAdmin(LookupAdmin):pass
…您将能够通过django管理中的“post state”链接修改表中的值。
django-lookup-tables
与开箱即用的表单进行了适当的集成,因此所有ui都会自然地获得最新的选择列表,就像使用带有选项枚举或元组列表的CharField
一样。
每个表都有一个任意的项列表。通过将“排序顺序”字段设置为任何正整数,可以对它们进行排序。
与admin-sortable2一起使用
如果您安装了django-admin-sortable2
,您可以通过配置django-lookup-tables
来使用它的ui增强功能。在你的settings.py
:
INSTALLED_APPS=(...'adminsortable2','lookup_tables',...)LOOKUP_TABLES={'USE_ADMIN_SORTABLE2':True,}
与django rest框架一起使用
如果在序列化程序中使用drf_fields.LookupSerializerField
字段,则模型上的字段的呈现方式与CharField
相同:
classPostSerializer(serializers.ModelSerializer):classMeta:fields=('id','title','state')state=LookupSerializerField(PostState)
默认情况下,该字段将发送LookupTableItem
的id
。如果要发送name
属性,请将DRF_REPRESENTATION_NAME_NOT_ID
添加到settings.py
:
LOOKUP_TABLES={# ...'DRF_REPRESENTATION_NAME_NOT_ID':True,# ...}
drf提供的html ui将填充下拉列表,并且OPTIONS
响应处理程序将为字段提供所有可用的键/值对:
OPTIONS/api/posts/1/HTTP200OKAllow:GET,PUT,PATCH,DELETE,HEAD,OPTIONSContent-Type:application/jsonVary:Accept{"name":"Post Instance","description":"","renders":["application/json","text/html"],"parses":["application/json","application/x-www-form-urlencoded","multipart/form-data"],"actions":{"PUT":{"id":{"type":"integer","required":false,"read_only":true,"label":"ID"},"title":{"type":"string","required":true,"read_only":false,"label":"Name","max_length":200},"state":{"type":"choice","required":true,"read_only":false,"label":"State","choices":[{"value":14,"display_name":"Draft"},{"value":18,"display_name":"Published"}]}}}}
示例应用程序
您可以看到一个使用这些字段的示例应用程序运行以下命令:
$ python manage.py migrate $ python manage.py loaddata fixtures/base.json $ python manage.py runserver
此应用程序具有以下终结点:
/admin/
/api/mymodel/
/api/mymodel/<id>/
管理员用户的用户名是admin
,密码是pass
。
贡献
我正在积极寻求对这一一揽子计划的捐助。请检查存储库的“问题”部分以获取我当前的命中列表。
如果你有其他功能的建议,我愿意听取他们的意见。使用存储库的“问题”部分开始对话。