- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是一个示例模型:
class FooModel(models.Model):
foo = models.DecimalField(max_digits=6, decimal_places=3, null=True)
序列化:
from django.core import serializers
obj = get_object_or_404(FooModel, pk=1)
data = serializers.serialize("json", [obj])
这将返回如下内容:
[
{
"pk": 1,
"model": "app.foomodel",
"fields": {
"foo": "50"
}
}
]
问题
如何使 foo 字段序列化为 float ,而不是字符串。我不想使用 float 模型类型,因为 float 有时不能正确存储小数。
提前谢谢你。
最佳答案
如果值实际上是 50
而不是 50.0
? Decimal
对象保留最初输入的任何内容,例如Decimal('50')
产生 50
。
>>> from decimal import Decimal
>>> d = Decimal('50')
>>> print d
50
不幸的是,提供给 DecimalField
构造函数的参数仅用于限制存储值而不是显示它们。
现在,因为 Django 只使用标准的 json/simplejson 库,您可以在序列化时指定自定义编码器,如 this question 中建议的那样:
import decimal
import json
class DecimalEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, decimal.Decimal):
return '%.2f' % obj # Display Decimal obj as float
return json.JSONEncoder.default(self, obj)
但它并没有就此结束。作为detailed in this blog post ,Django 显式地将 cls=DjangoJSONEncoder
传递给 simplejson.dump(...)
,因此我们还必须通过创建引用 的自定义序列化程序对象来规避此问题我们创建的 DecimalEncoder
:
from django.core.serializers.json import Serializer as JSONSerializer
class DecimalSerializer(JSONSerializer):
def end_serialization(self):
self.options.pop('stream', None)
self.options.pop('fields', None)
json.dump(self.objects, self.stream, cls=DecimalEncoder, **self.options)
接下来,您将 DecimalSerializer
实例化为您自己的序列化程序对象,然后奇迹发生了:
my_serializer = DecimalSerializer()
print my_serializer.serialize([obj], indent=4)
产生:
[
{
"pk": 1,
"model": "app.foomodel",
"fields": {
"foo": "50.00"
}
}
]
这看起来工作量很大。使用 Django 的 model validation 可能更容易在保存之前确保 FooModel.foo
字段始终是 float 。这是暴力尝试:
from django.core.exceptions import ValidationError
class FooModel(models.Model):
foo = models.DecimalField(max_digits=6, decimal_places=3, null=True)
def clean(self):
if '.' not in str(self.foo):
raise ValidationError('Input must be float!')
def save(self, *args, **kwargs):
self.full_clean()
super(FooModel, self).save(*args, **kwargs)
然后:
>>> f = FooModel(foo='1')
>>> f.save()
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/home/jathan/sandbox/foo/app/models.py", line 15, in save
self.full_clean()
File "/usr/local/lib/python2.6/dist-packages/django/db/models/base.py", line 828, in full_clean
raise ValidationError(errors)
ValidationError: {'__all__': [u'Input must be float!']}
关于python - 使用适当的十进制数据类型将django中的模型序列化为json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8235513/
这段代码在 Java 中的等价物是什么?我放了一部分,我对 I/O 部分感兴趣: int fd = open(FILE_NAME, O_WRONLY); int ret = 0; if (fd =
我正在尝试将维度为 d1,d2,d3 的张量 M[a1,a2,a3] reshape 为维度为 d2, d1*d3 的矩阵 M[a2,a1*a3]。我试过 M.reshape(d2,d1*d3) 但是
我是一名优秀的程序员,十分优秀!