我有一个使用JSONField的mysql表,它是TextField(django)类型。 这就是我的模型看起来
from django.db import models
from json_field import JSONField
class Model(models.Model):
obj = JSONField()
我通过tastypie发送的值是
json_string = '{"data":"value"}'
进入数据库,我可以看到
{"data":"value"}
但是当使用curl对数据进行检索时,我会得到类似这样的内容
"{u'data': u'value'}"
我能做些什么才能让python u'field'代表tastypie的输出?
谢谢!
答案 0 :(得分:5)
我解决了这个问题:
def dehydrate_user_inputs(self, bundle):
requirement = Requirement.objects.get(pk = bundle.obj.pk)
user_inputs = json.dumps(requirement.user_inputs)
return user_inputs
我的JSONField名为user_inputs。要求是它所属的模型。
当Tastypie已经为我做过这样的查询时,我觉得很奇怪,但是,这很有效。如果有更好的解决方案,我会喜欢。
答案 1 :(得分:4)
您看到的错误是由Tastypie将JSONField视为TextArea并在对象JSONField上调用str()然后将其返回给调用者之前引起的。
另一种方法是使用field.ApiFields作为JSONField。这是有效的,因为fields.ApiFields不会在(hydrate())或way out(convert())的路上执行任何转换。这正是我们想要的 - 底层JSONField会将JSON对象转换为字符串,以便在路上进行持久化,并在出路时从字符串中重新创建对象。因此,tastypie不需要做任何事情。我的代码看起来有点像这样(基于OP的例子的类/变量名) -
class JSONField(fields.apiField):
""" Wrapper over fields.apiField to make what we're doing here clear """
pass
class MyModelResource(ModelResource):
obj = JSONField('obj')
答案 2 :(得分:3)
使用DictField
:
obj = fields.DictField(attribute='obj')
答案 3 :(得分:1)
我遇到了类似的问题,我的unicode字符串将在API中以奇怪的格式返回(我认为返回原始编码字符串而不是实际的utf-8字符)。
无论如何,不使用脱水方法并重新执行查询,最好在资源中使用自定义序列化程序。
这就是我使用的:
class JSONSerializer(Serializer):
'''using the standard json library for better unicode support,
also note django.utils.simplejson, used in the standard Tastypie serializer,
is set for depreciation'''
def to_json(self, data, options=None):
options = options or {}
data = self.to_simple(data, options)
return json.dumps(data)
然后在你的资源中:
class PlaceResource(ModelResource):
class Meta:
queryset = Place.objects.all()
resource_name = 'place'
serializer = JSONSerializer()