如何向 TextChoices 添加额外数据?

2023-12-02

我如何添加额外的数据django.db.models.TextChoices?

class Fruit(models.TextChoices):

    APPLE = ('myvalue', True, 'mylabel')

这样:

>>> Fruit.APPLE.is_tasty
True
>>> # And it still works otherwise
>>> Fruit.APPLE.value
'myvalue'
>>> Fruit.APPLE.label
'mylabel'

你需要做一些类似于python 枚举文档建议,但与 python 不同Enum,标签已经由models.Choices:

class Fruit(models.TextChoices):

    APPLE = ('myvalue', True, 'mylabel')

    def __new__(cls, value, is_tasty):
        obj = str.__new__(cls, value)
        obj._value_ = value
        obj.is_tasty = is_tasty
        return obj

如果您在IntegerChoices, 你需要int.__new__。如果你使用__init__代替__new__,枚举值将变为('myvalue', True),它被用于Fruit.choices并且可能不适合您的模型字段。

尽管请注意,当在模型字段上使用选择枚举时,您实际上从未将枚举传递给它,因此它不知道枚举。例如。从中派生出的表单字段ModelForm会将他们视为str值并且在 POST 之后字段值将是常规值str,不是枚举值。对于表单案例,您可以定义MyForm.clean_fruit或提供手动表单字段TypedChoiceField(coerce=Fruit),在其他地方您可能需要再次查找枚举值Fruit(value)或者您可以将此 mixin 添加到您的字段中:

class EnumMixin:

    'Convert a DB value back to its Choices value'

    def __init__(self, *args, enum: models.Choices, **kwargs):
        self.__enum = enum
        # it sets choices for you using the enum
        super().__init__(*args, choices=enum.choices, **kwargs)

    def deconstruct(self):
        'Get constructor args to reconstruct this field with later'
        name, path, args, kwargs = super().deconstruct()
        kwargs['enum'] = self.__enum
        del kwargs['choices']
        return name, path, args, kwargs

    def from_db_value(self, value, expression, connection):
        # Convert from db value
        return self.__to_enum(value)

    def to_python(self, value):
        'Called by deserialization and during clean() method used in forms'
        return self.__to_enum(value)

    def __to_enum(self, value):
        if value is None:
            return None
        return self.__enum(value)

class EnumCharField(EnumMixin, models.CharField):
    pass

class MyModel(models.Model):
    field = EnumCharField(enum=Fruit, ...)

deconstruct由 django 迁移使用,但请注意它不会重建Enum在您进行迁移时,它将使用您的任何内容Enum是在您应用迁移时。

为什么不叫super呢?

While super().__new__一般情况下工作正常,但情况并非如此Enum子类(models.TextChoices is a models.Choices这是一个Enum)。 Python 文档注意以下几点:

The __new__()方法(如果已定义)将在创建 Enum 成员期间使用;然后它被 Enum 替换__new__()它在类创建后用于查找现有成员。

So, EnumMeta取代班级'__new__ with Enum.__new__ on Fruit, TextChoices,...如果你打电话super().__new__ in Fruit.__new__那么这调用TextChoices.__new__这实际上是Enum.__new__并且它不会期望您传递给它的参数(即使它确实接受了您的参数,它也不会调用super().__new__本身)。

它将提高:

ValueError: 'myvalue' is not a valid Fruit
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何向 TextChoices 添加额外数据? 的相关文章

  • Django Rest框架Json解析

    我想解析传入的POSTdjangoviews py 文件中的数据 发布数据 number 17386372 data banana apple grapes 这是我尝试读取上述传入数据的方法request views py class Fr
  • Django:使用 Django ORM 实现 JOIN?

    我有一个用 Django 构建的问答类型的网站 具有以下模型 class Question models Model title models CharField max length 70 details models TextField
  • 如何删除django中级联的一对一相关模型?

    背景 我在 Django 1 8 5 中定义了以下模型 class PublishInfo models Model pass class Book models Model info models OneToOneField Publis
  • django-admin.py makemessages 不起作用

    我正在尝试翻译一个字符串 load i18n trans Well Hello there how are you to Hola amigo que tal 我的 settings py 文件有这样的内容 LOCALE PATHS os
  • Django 管理列降序排序

    当使用 Django admin 时格拉佩利 https github com sehmaschine django grappelli我希望单击列标题即可按降序对表格进行排序 我不希望通过在模型元类中定义排序字段来对列进行默认排序 默认行
  • 使用单选按钮渲染 ChoiceField

    我从模型构建了这个表格 class Configure template forms Form subject type forms ChoiceField choices Subject type objects all 我想使用单选按钮
  • Python 和 Django IDE 具有远程编辑功能吗?

    我正在寻找一个 IDE 它允许我编辑远程 Python 项目 并且还具有良好的 Django 支持 远程命令执行以及远程调试 我已经尝试使用 PyCharm 和 Aptana 与 PyDev 但我在配置它们进行远程编辑时运气不佳 感谢您的帮
  • Django 营业时间

    我想添加诊所的营业时间 我已经对此进行了调查在 Django 中实现 开放时间 的任何现有解决方案 https stackoverflow com questions 8128143 any existing solution to imp
  • 如何去除html源代码中的空格

    我正在使用 django 和 python 在模板文件中 我有一个下拉列表 如下所示 有用 唯一的问题是源 html 代码之间有很多空白 有什么办法可以去除空白吗 谢谢 for lang ele in video languages all
  • 配置 Django 和 Google 云存储?

    I am not使用应用引擎 我有一个在虚拟机上运行的普通 Django 应用程序 我想使用 Google Cloud Storage 来提供静态文件 以及上传 提供媒体文件 我有一个水桶 如何将 Django 应用程序链接到我的存储桶 我
  • python:日志记录:我们可以向记录器添加多个过滤器吗?考虑哪一个

    我试图了解 Python 日志记录中的多个过滤器 一个在配置中定义 另一个在代码中定义 如何工作 我正在开发一个 Django 项目 下面是我在 settings py 中的记录器配置 我的目标是switch on and switch o
  • 将 Django +1.10 与 MongoDB 连接

    在过去的几个月里 有人为 MongoDB 更换了 Django 1 10 中的默认数据库引擎吗 我在谷歌上得到的所有信息都是六四年前的 最常见的结果包括mongodb 引擎这需要Django nonrel 来自 Django 1 5 的一个
  • django 根据 UserProfile.language() 字段数据发送本地化电子邮件

    在我的优惠网站中 如果优惠满足某些要求 模型中指定的过滤器 用户可以设置电子邮件警报 因此 当用户 A 添加报价时 post save 信号将发送到 celery 并检查是否应用了用户警报过滤器 如果有 则发送电子邮件 问题是我不知道如何安
  • django ajax post 403被禁止

    使用 django 1 4 当我尝试从我的 javascript 做我的 django 服务器上的帖子时 我收到 403 错误 我的 get 工作正常 尽管问题仅出在帖子上 也尝试过 csrf exempt但没有运气 更新 我现在可以发布我
  • 在 django vanilla CreateView 上设置当前用户

    我想用当前登录的用户更新我的模型 我正在使用 django vanilla views 为了存储新记录 我尝试使用 CreateView 我不想在表单上显示用户 只需自动更新即可 这是我的模型 class Measurement model
  • AWS beanstalk + Django:502 错误网关 - ModuleNotFoundError:没有名为“应用程序”的模块

    我正在尝试将 Django 项目部署到 Elastic Beanstalk 我正在遵循他们的指南 https docs aws amazon com elasticbeanstalk latest dg create deploy pyth
  • Web 客户端和移动 REST API 安全性的推荐配置

    我意识到关于这个主题有很多问题 我已经研究了几天了 我想确保我的问题尽可能具体 因为我还没有完全理解最佳方法 目前我有一个开发的 django 站点 Web 客户端大约 95 是通过 django piston json REST api
  • 操作错误:游标“_django_curs_”不存在

    我们有一个由 django postgresql 和 heroku 提供支持的在线商店 Web 应用程序 对于特定的活动 您可以将活动视为要购买的产品 我们已成功售出 10 000 份以上的副本 然而 根据我们的 Sentry 报告 我们的
  • Django 评论和评级系统

    我正在寻找一个可以与我的 Django 网站顺利集成的博客和评论系统 我在网上发现了很多 但有点迷失了 我在这方面没有太多经验 希望大家能给我一些建议 以下是我想要拥有的东西 标签云 文章存档 按月 按年 文章评级 例如带有星星或自定义图标
  • 在 Django Rest Framework 中访问视图集和序列化器中的请求对象?

    我想访问 DRF 中 Views py 和 Serializers py 中的请求对象 我的观点 py class ProductViewSet viewsets ReadOnlyModelViewSet This viewset auto

随机推荐

  • NSMutableArray 中的lastObject 是否返回对象的副本?

    我有一个与这段代码相关的问题 NSNumber lastObject self myStack lastObject if lastObject self myStack removeLastObject return lastObject
  • 点击事件时清除 QLineEdit

    我正在使用给定的代码 我希望用户在 QLineEdit 小部件中输入文本 然后按复制 按钮并看到输入的文本替换了 N A 标签 我的问题是 按照此过程 如何通过简单的鼠标单击清除 QLineEdit 小部件中输入的文本 从我读到的 this
  • 旋转方法已弃用,相当于“didRotateFromInterfaceOrientation”?

    我正在尝试实施新的viewWillTransitionToSizeiOS 8 中引入的方法 所有其他旋转方法已被弃用 我想知道相当于什么didRotateFromInterfaceOrientation现在是因为我们需要执行许多清理任务 但
  • 为什么我们不能使用 new 关键字创建活动?

    为什么我们必须使用意图来启动活动 为什么我们不能使用 Activity a new Activity 启动它 我尝试在android开发者中搜索但没有得到任何答案 可以 但它不会完全初始化 Activity 上有一系列函数需要以正确的顺序调
  • Java - 私有和包私有枚举构造函数之间的区别[重复]

    这个问题在这里已经有答案了 最近我经常使用枚举 所以我想知道 私有枚举构造函数和没有任何可见性修饰符的枚举构造函数 包私有 之间有什么区别吗 枚举的构造函数是隐式的private 就像接口和注释的方法是隐式的public abstract
  • 如何在运行时正确压缩 UIImages

    我需要加载 4 个图像进行同时编辑 当我从用户库加载它们时 内存超过 500mb 并且崩溃 以下是我尝试进行任何压缩之前原始分配转储的日志 Code var pickedImage UIImage data imageData Instru
  • 如何从我的应用程序打开标准 Google 地图应用程序?

    一旦用户按下我的应用程序中的按钮 我想打开标准的 Google 地图应用程序并显示特定位置 我该怎么做 不使用com google android maps MapView 你应该创建一个Intent具有 geo URI 的对象 Strin
  • LibGDX 保存纹理以避免上下文丢失

    我的基于 LibGDX 的 Android 应用程序中有一个纹理 它是通过 FrameBuffers 按程序创建的 我需要通过上下文丢失来保留它 而且似乎唯一有效的方法就是简单地保存数据 无论是作为完整图像还是原始图像数据 输出 并在时间到
  • 使用 spring security 自定义注释

    我已阅读 Spring Security 文档 并了解到我可以使用以下注释来检查主题是否有权编辑用户 PreAuthorize hasPermission USER EDIT public String editUSer User user
  • 如何计算文本字符串中的单词数?

    在 iOS 上 如何计算特定文本字符串中的单词数 比拆分更有效的方法是逐个字符检查字符串 int word count NSString s CFCharacterSetRef alpha CFCharacterSetGetPredefin
  • 在 Angular js 中调用 $sce.trustAsHtml() 字符串内的函数

    我正在使用 Angularjs 开发一个应用程序并添加HTML using sce trustAsHtml 在我的页面中 我想在上面动态添加的内容中调用一个函数 我的 html 和脚本如下 HTML div div p p div div
  • HTML 字段集内容在 100% 高度溢出 (Chrome)

    我的 HTML 有问题fieldsetChrome 中的元素 我想要一个固定高度fieldset 其中有一个可滚动的div 一切看起来都很好 直到我把legend 当我这样做时 div从底部溢出fieldset 我还在 Firefox 中进
  • Python 3 包和脚本中导入的最佳实践

    考虑这个简单的文件夹结构 root Package1 x py y py Package2 z py Examples main py 现在我们的要求是 x py需要导入y py z py需要导入y py main py需要导入y py和z
  • “main”通常是一个非静态函数错误

    显示两个错误 main c 80 警告 main 通常是一个非静态函数 main c 88 错误 输入末尾处的预期声明或语句 我似乎找不到问题 花括号的数量是相等的 似乎是什么问题 include
  • SQL - 从一组结果中选择唯一的行

    我为这个问题绞尽脑汁已经有一段时间了 我还审查了其他问题 但没有成功 我遇到的问题是 我有一个结果 表列表 其中包含多行和列 注册 ID 日期 单位类型 005DTHGP 172 172 2007 09 11 生物酶 005DTHGP 19
  • 最小化 Java 函数调用开销

    I have 一段代码在我运行的每个测试中 函数调用都会产生大量开销 该代码是一个紧密循环 对数组 包含 4 800 万个元素 的每个元素执行一个非常简单的函数ints 运行代码 主要包括 for int y 1 y lt h y for
  • 使用 meshgrid 将 X,Y,Z 三元组转换为三个二维数组,用于 matplotlib 中的曲面图

    我是 Python 新手 所以请耐心等待 我很感激任何帮助 我拥有的 三个一维列表 xr yr zr 一个包含 x 值 另外两个包含 y 和 z 值 我想做的事 在 matplotlib 中创建 3D 等高线图 我意识到我需要使用以下方法将
  • 使用 ClickOnce 应用程序部署 COM 组件

    我们正在开发一个需要屏幕 录制 的 C WPF Net 4 0 应用程序 我们评估了 ByteScout屏幕截图SDK 提供免费试用 它完全满足我们的需要 然而 问题是我们的应用程序设计为由 ClickOnce 部署到我们客户的计算机 不在
  • 将 JSON 日期发送到 WCF 服务

    我想将 json 对象发布到我的 WCF 服务 我唯一的问题是他的日期属性 我从 jquery datepicker 获取日期 我想将其作为 c datetime 获取到我的服务中 我的服务 namespace Employee Servi
  • 如何向 TextChoices 添加额外数据?

    我如何添加额外的数据django db models TextChoices class Fruit models TextChoices APPLE myvalue True mylabel 这样 gt gt gt Fruit APPLE