Django(JSONField)和tastypie

时间:2013-01-17 19:05:05

标签: django json tastypie

我有一个使用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的输出?

谢谢!

4 个答案:

答案 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()