- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
为什么 get_FOO_display() 在记录信息 (django) 时返回整数值?
我有一个模型字段,它使用一个选项来限制其值。这很好用我让它在应用程序中的任何地方都可以工作,除了记录信息时,当 get_FOO_display() 方法返回底层整数值时人类可读版本。
这是模型定义(删节):
THING_ROLE_MONSTER = 0
THING_ROLE_MUMMY = 1
ROLE_CHOICES = (
(THING_ROLE_MONSTER, u'Monster'),
(THING_ROLE_MUMMY, u'Mummy'),
)
# definition of property within model
class Thing(models.Model):
...
role = models.IntegerField(
'Role',
default=0,
choices=ROLE_CHOICES
)
如果我在(django)交互式 shell 中运行它,它的行为完全符合您的预期:
>>> from frankenstein.core.models import Thing
>>> thing = Thing()
>>> thing.role = 0
>>> thing.get_role_display()
u'Monster'
但是,当我在字符串格式化/日志记录中使用完全相同的构造时我遇到问题的场景:
logger.info('New thing: <b>%s</b>', thing.get_role_display())
返回:
New thing: <b>0</b>
救命啊!
[更新1]
当我在交互式 shell 中运行日志记录时,我得到了正确的输出:
>>> from frankenstein.core.models import Thing
>>> import logging
>>> thing = Thing()
>>> thing.role = 0
>>> logging.info('hello %s', b.get_role_display())
INFO hello Monster
[更新2] Django 内部结构
根据下面 @joao-oliveira 的回答,我深入研究了内部结构并发现了以下内容。
django.db.models 中的底层 _get_FIELD_display 方法如下所示:
def _get_FIELD_display(self, field):
value = getattr(self, field.attname)
return force_unicode(dict(field.flatchoices).get(value, value), strings_only=True)
如果我在代码中放置一个断点,然后运行 ipdb,我可以看到存在问题:
ipdb> thing.get_role_display()
u'1'
ipdb> thing._get_FIELD_display(thing._meta.get_field('role'))
u'1'
所以,修复并没有改变任何东西。如果我随后尝试手动运行 _get_FIELD_display
方法代码,我会得到以下结果:
ipdb> fld = thing._meta.get_field('role')
ipdb> fld.flatchoices
[(0, 'Monster'), (1, 'Mummy')]
ipdb> getattr(thing, fld.attname)
u'1'
ipdb> value = getattr(thing, fld.attname)
ipdb> dict(fld.flatchoices).get(value, value)
u'1'
这相当于说:
ipdb> {0: 'Monster', 1: 'Mummy'}.get(u'1', u'1')
u'1'
所以。我们遇到的问题是,该方法使用字符串值 u'1'
在选择字典中查找相应的描述,但字典键是整数,而不是字符串。因此,我们永远不会得到匹配项,而是得到默认值,该值设置为现有值(字符串)。
如果我手动强制转换为 int,代码将按预期工作:
ipdb> dict(fld.flatchoices).get(int(value), value)
'Mummy'
ipdb> print 'w00t'
这一切都很棒,但并没有回答我最初的问题,即为什么 get_foo_display 方法在大多数情况下确实返回正确的值。在某些时候,字符串 (u'1') 必须转换为正确的数据类型 (1)。
[更新3]答案
虽然必须对 Joao 的洞察力给予荣誉奖,但 Josh 指出了我一开始就传递了错误值这一直言不讳的事实。我把这归结为来自“强类型世界”的移民,这些事情不可能发生!
我在这里没有包含的代码是,该对象是使用 ChoiceField 中的 cleaned_data
从 django 表单初始化的。 。问题在于 ChoiceField 的输出是字符串,而不是整数。我错过的一点是,在松散类型语言中,可以使用字符串设置整数属性,并且不会发生任何不好的事情。
现在研究了这一点,我发现我应该使用 TypedChoiceField ,以确保 cleaned_data
的输出始终是整数。
谢谢大家。
最佳答案
如果这听起来有点居高临下,我真的很抱歉,但是您是否 100% 确定将值设置为整数 1 而不是字符串“1”?
我已经深入研究了内部结构并运行了一些测试,您遇到的问题唯一有意义的方法是您是否将值设置为字符串。在这里查看我的简单测试:
>>> from flogger.models import TestUser
>>> t = TestUser()
>>> t.status = 1
>>> t.get_status_display()
u'Admin'
>>> t.status = '1'
>>> t.get_status_display()
u'1'
检查您的 View 代码或实际设置值的任何代码,并直接检查字段的输出。
当您从内部模型代码粘贴时:
def _get_FIELD_display(self, field):
value = getattr(self, field.attname)
return force_unicode(dict(field.flatchoices).get(value, value), strings_only=True)
它只是获取字段的当前值,并索引到字典中,如果未找到查找,则返回属性的值。
我猜之前没有错误,因为该值在插入数据库之前被强制转换为整数。
编辑:
关于您提到 python 类型系统的更新。首先,您应该使用 TypedChoiceField以确保表单验证您期望的类型。其次,Python是一种强类型语言,但是IntegerField
在准备数据库时会使用int()
进行自己的强制转换。
变量不是类型化的,而是变量中的值。事实上,我很惊讶 IntegerField 也将字符串强制转换为 int。在这里学习很好的类(class) - 首先检查基础知识!
关于django - 为什么 get_FOO_display() 在记录信息(django)时返回整数值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13347128/
03-25 05:52:15.329 8029-8042/com.mgh.radio W/MediaPlayerNative: info/warning (703, 0) 03-25 05:52:15
我一直在 Internet 上到处寻找关于 FrameworkElementFactory 类的适当文档,但我似乎找不到有关它的适当教程或有用信息。 请问对这个问题了解更多的人可以给我更多的信息吗?这
我需要知道一个线程在进入等待状态之前如何将其ID发送到另一个线程。我想传递一个带有其ID的变量,但我不知道该怎么做。 最佳答案 如果只有一个线程及其父线程,则可以使用全局变量,因为它们在所有线程之间共
我正在尝试制作一个程序,该程序可以读取命令行上的所有单词,然后将其打印在新行上,而我想要做的是这样的: Some text: hello 但是相反,我得到了这样的东西: Some text: Hell
我有一个连接到rabbitmq服务器的python程序。当该程序启动时,它连接良好。但是当rabbitmq服务器重新启动时,我的程序无法重新连接到它,并留下错误“Socket已关闭”(由kombu产生
我正在设置CI / CD管道。部署步骤运行以下命令: kubectl apply -f manifest.yml --namespace kubectl rollout status Deploym
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 4 年前。 Improve this ques
这是我在文件上运行 svn info 时输出的一部分: Last Changed Author: [user] Last Changed Rev: 269612 Last Changed Date:
所以我正在构建这个音乐应用程序,到目前为止它只扫描 SD 卡内的特定文件夹。这将返回路径,然后播放它们。 几个小时前我得知android系统中有一个媒体文件数据库所以 我想知道这个媒体文件数据库是否存
我正在绘制树形图,并且想知道如何绘制树类的相对百分比,即 A组=100 B地=30 C地=50 D 地 =20 然后,在图中,应该添加: A 组“50%” B 组“15%” 等在其“Group X”标
我正在构建一个社交网站,我想知道如何在用户首次登录时显示交互式教程和信息。比如只有在第一次登录时,用户才会被要求在他们的个人资料中填写更多信息。我怎样才能通过 php 和 mysql 实现这一点?例子
我是 java servlet 的新手。我研究了一些关于 servlet 的代码,但我真的很想知道更多基本的东西以及它是如何工作的。我只是想知道什么类型的 Material /内容可以从 java s
我想知道是否有办法为 user_id、sender_user_id 和 recipient_user_id 提供 name 信息来自 this fiddle 中的模式. 我现在唯一能想到的办法就是做这
这是我存储2个大学生信息的源代码。我想从输入中获取每个人的姓名、姓氏、ID 和 5 分,然后在输出中显示它们。我在输出中显示分数时遇到问题。 请帮忙 #include using namespace
假设我有一张带有条形图的图像,如下所示: 我想提取条形图和标签的值,除了训练 ML 模型之外,还有其他方法吗? 我有一堆图像,我为其生成了图表和一些描述。我目前正尝试仅从我能够做到的描述中提取信息,但
有没有办法从 GKTurnBasedParticipant 对象中检索玩家的名字?似乎除了根据类引用的难看的 playerID 之外,没有办法显示有关游戏玩家的相关信息。还是我遗漏了什么? 谢谢...
我有一个随机抛出“KeyNotFoundException”的 C# Silverlight 应用程序。我不知道找不到什么 key 。这让我想到了两个问题: KeyNotFoundException
本文实例为大家分享了ios获取本地音频文件的具体代码,供大家参考,具体内容如下 获取本地音频文件地址: ?
下面为大家介绍利用SQL查询语句获取Mysql数据库中表的表名,表描述、字段ID、字段名、数据类型、长度、精度、是否可以为null、默认值、是否自增、是否是主键、列描述 1、查询表信息(表名/表
问题 有没有办法获取代码中使用属性的位置,或声明成员变量的位置? 我不是在寻找解决此问题的方法,只是寻求一个简单的答案,无论这在技术上是否可行。 一些背景信息 我已经定义了一个属性,该属性使用提供给属
我是一名优秀的程序员,十分优秀!