将所有查找表合并到一个统一的系统中。

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)

默认情况下,该字段将发送LookupTableItemid。如果要发送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

贡献

我正在积极寻求对这一一揽子计划的捐助。请检查存储库的“问题”部分以获取我当前的命中列表。

如果你有其他功能的建议,我愿意听取他们的意见。使用存储库的“问题”部分开始对话。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java以编程方式最小化JInternalFrame?   java使用JsonPath将不均匀列表提取为类型化对象   spring如何将java/resources文件获取到InputStream?   Java逻辑错误并不总是存在   java Firebase,更新特定字段   Java stream groupby并同时加入以进行csv导出   java安卓:如果出现任何声音,监听器将录制声音   java如何从多个文件中轮询最后修改的文件并发送到apache camel中的目标端点?   java是否返回多个比较器?   JavaBean IO:Date MMM在CAPS中不解析   当JButton从另一个类单击时,java正在更新JLabel   基类中子类的Java泛型初始化   jakarta ee Java ee制作一个以毫秒为间隔的计时器来发送数据包   json Windows Azure日期格式转换为Java日期