7

我使用 JSONField 在 mysql 中有一个类型为 TextField (django) 的表。这就是我的模型的外观

from django.db import models
from json_field import JSONField

class Model(models.Model):
   obj     = JSONField()

我通过美味派发送的价值是

json_string = '{"data":"value"}'

进入数据库我可以看到

{"data":"value"}

但是当用 curl 检索数据时,我会得到这样的结果

"{u'data': u'value'}"

我能做些什么不让 python u'field' 表示到美味派的输出中?

谢谢!

4

4 回答 4

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 已经为我这样做时,我觉得在这里进行查询很奇怪,但是,这很有效。如果有更好的解决方案,我会很高兴。

于 2013-04-05T21:50:08.313 回答
4

您看到的错误是由 Tastypie 将 JSONField 视为 TextArea 并在将 JSONField 返回的对象返回给调用者之前调用 str() 引起的。

另一种方法是对 JSONField 使用 fields.ApiFields。这是有效的,因为 fields.ApiFields 不会在进入 (hydrate()) 或离开 (convert()) 的方式上执行任何转换。这正是我们想要的——底层的 JSONField 会将 JSON 对象转换为字符串,以便在输入时保持持久性,并在输出时从字符串重新创建对象。因此,tastepie 不需要做任何事情。我的代码看起来有点像这样(基于 OP 示例的类/变量名称) -

class JSONField(fields.apiField):
    """ Wrapper over fields.apiField to make what we're doing here clear """
    pass

class MyModelResource(ModelResource):
    obj = JSONField('obj')
于 2015-05-14T21:57:19.017 回答
3

使用DictField

obj = fields.DictField(attribute='obj')
于 2014-08-06T06:32:25.253 回答
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()
于 2013-10-03T10:34:19.243 回答