可重用的Django应用程序,用于自动实现dunder的`__repr__`和`__str__`
项目描述
django-dunder
django-dunder是一个可安装的应用程序,可自动提供可定制的__repr__
和__str__
,用于其他Django第三方可安装应用程序和项目应用程序。
在Python 3上,如果存在__unicode__
且没有__str__
,则可以使用__unicode__
,例如在Python 3上运行但尚未完全更新的应用程序。
每次遇到活动模型中的__unicode__
时,它都会发出警告。即使是在Python 2上,当__unicode__
与__str__
相同,也会提供自定义警告,以指示需要进行的代码更改以完成Python 3迁移。
此应用程序的动机是在为https://github.com/viper-development/ 咨询时出现的,该网站快速构建应用程序,开发自定义功能而不是编写样板代码。
默认情况下,它将检测并附加到使用默认__repr__
和__str__
的现有模型。
可以指示它覆盖特定模型的__repr__
和__str__
,如果模型具有专用方法但输出不可取,则很有用。
它将查找主键和唯一键,以尝试显示用户识别记录所需的最小必要信息。
注意:在Python 2中,它将添加一个__str__
,这可能会在它决定显示的字段中包含Unicode值的模型实例中发出非ASCII字符。使用设置取消选择任何此类模型。我愿意审查添加适当Python 2支持的PR,但我会拒绝任何部分Python 2支持。在没有充分理由的情况下,我不认为在2020年这样做是合理的。
安装
pip install django-dunder
- 在需要添加dunder的模型之前,将
django_dunder
添加到INSTALLED_APPS
中。
为了捕获所有缺少__str__
或__repr__
的模型,将其放在INSTALLED_APPS
的顶部。
为了快速查看它如何改进Django管理界面,在开发之前和之后安装django-data-browser
,然后单击任何使用Django默认字符串表示法的模型的“admin”列。
配置
要禁用Unicode警告,设置DUNDER_WARN_UNICODE = False
。
为了有更多的控制,在您的settings
中切换这些“auto”,“force”和“exclude”设置。
要禁用一个或两个__str__
和__repr__
的自动附加,设置以下之一
DUNDER_AUTO = False
DUNDER_AUTO_REPR = False
DUNDER_AUTO_STR = False
DUNDER_COPY_UNICODE = False
要强制所有模型使用这些方法,使用DUNDER_FORCE = True
,或将DUNDER_FORCE_REPR
或DUNDER_FORCE_STR
设置为True
。
要强制特定模型使用,DUNDER_FORCE_REPR
和DUNDER_FORCE_STR
可以定义为一个模型标签列表,例如auth.User
。
当使用auto或force模式时,可以通过向排除设置提供模型标签列表来排除特定模型。
DUNDER_REPR_EXCLUDE = ['auth.User']
DUNDER_STR_EXCLUDE = ['myapp.Person']
注意 当在Python 3上禁用__unicode__
的复制,并且Django设置DEBUG
也禁用时,如果该应用发现__unicode__
,则会引发ImproperlyConfigured
,因为它假定应用旨在使用__unicode__
,并且在生产中与默认的Django __str__
一起运行会导致行为错误。要禁用此功能,重新启用Unicode的复制,或将
DUNDER_REJECT_UNICODE = False
还有一个Django 检查用于不活动的自定义__unicode__
,它独立于模型注册过程运行,因此更安全。它默认发出错误,但它可以设置为发出错误或禁用,设置为False
。
DUNDER_CHECK_INACTIVE_UNICODE = 'warn'
格式化
以下给出的__str__
和__repr__
的默认格式可以在设置中全局修改。
-
DUNDER_REPR_ATTR_FMT = '{name}={value!r}'
-
DUNDER_REPR_FMT = '{}({})'
-
DUNDER_STR_ATTR_FMT = '{name}={value}'
-
DUNDER_STR_FMT = '<{}: {}>'
除了标准的Python字符串格式化语法外,一些实验性的幕后魔法允许将属性修改器连接在一起。这仅在两个属性格式化程序中有效。类型的方法是透明调用的,以及内置方法。
例如,DUNDER_STR_ATTR_FMT = '{name}={value.round__title}'
将向上舍入数字并应用标题大小写。
此外,还有一个额外的修饰符ellipsis
,可以用来截断长文本字段,并附加一个...
省略号。默认为100个字符。
例如,DUNDER_STR_ATTR_FMT = '{name}={value.round__ellipsis_20}'
将向上舍入数字并将字符串缩短到最多20个字符。
在CPython上,可以使用forbiddenfruit
库向核心类型添加方法。例如,如果按照说明安装了datatype-tools
,并在settings.py
或一些其他早期加载的Django代码中导入,则使用()
语法使用包含下划线_
的方法名称。
DUNDER_STR_ATTR_FMT = '{name}={value.round__ellipsis_20__format_date()}'
在从库中安装核心类型自定义方法时,请注意它们通常重用现有的核心方法或内置名称。在datatype-tools
的情况下,它提供了一个float.round()
,默认使用两位有效数字,而round(float)
的默认值为零。
在构建核心类型自定义方法时,避免使用与Python名称或Django名称冲突的方法名称。否则,可能会出现类似https://github.com/havocesp/typext/issues/1的问题。
想要更多吗?如果你能找到实验性的魔法,可以扩展它,并使用以下方式激活:
DUNDER_WRAPPER_CLASS = 'your_magic.Wrapper'
请提交PR以在此处添加你的魔法,供他人使用。
显式字段
要在str()
或repr()
中显示特定字段,django-dunder会自动添加两个额外的模型元选项。
from django.db import models
class MyModel(models.Model):
uuid = models.TextField()
first_name = models.TextField()
last_name = models.TextField()
...
Meta:
str_fields = ('first_name', 'last_name')
repr_fields = ('uuid', )
显式混入
或者禁用自动模式(DUNDER_AUTO = False
),并使用混入,并设置
from django_dunder.mixins import DunderModel
class MyModel(DunderModel):
first_name = models.TextField()
last_name = models.TextField()
...
Meta:
repr_fields = ('first_name', 'last_name')
添加元选项可能会导致异常,如果从INSTALLED_APPS
中删除django-dunder。
为了避免这种情况,请使用djsommo
扩展到其他类型
应该可以在这里将功能应用到除了Django模型和实例以外的类型。可能需要通过额外的配置来识别要修补的适当类。
对于CPython仅限的终极解决方案可能是,如果它的类型dunder可以被“诅咒”,特别是如果可以替换object.__str__
和object.__repr__
。
替代方案
django-dunder在项目使用不提供这些适合项目的dunder方法的第三方应用时非常有用。实际上,一些django.contrib
模型不提供这些dunder方法。
灵感来自
它们可能对某些项目足够。
如果不相关,并且项目使用sentry,且项目只想有一个合理的__repr__
,可以将装饰器合并到sentry.db.models
中,形成一个在整个项目中使用的基混入模型。
开始一个新项目,并且只对您的模型感兴趣?pydantic提供默认和可定制的dunder,而django-ninja在顶部提供Django REST接口,并且有很多其他工具建立在pydantic之上,例如pydantic-ui提供类似Django Admin的界面。
项目详细信息
下载文件
下载适合您的平台文件。如果您不确定要选择哪个,请了解更多关于安装软件包的信息。