跳转到主要内容

可重用的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年这样做是合理的。

安装

  1. pip install django-dunder
  2. 在需要添加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_REPRDUNDER_FORCE_STR设置为True

要强制特定模型使用,DUNDER_FORCE_REPRDUNDER_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的界面。

项目详细信息


下载文件

下载适合您的平台文件。如果您不确定要选择哪个,请了解更多关于安装软件包的信息。

源分布

django-dunder-0.3.0.tar.gz (22.1 kB 查看哈希)

上传时间

构建分布

django_dunder-0.3.0-py2.py3-none-any.whl (19.9 kB 查看哈希)

上传于 Python 2 Python 3