2013-01-17 92 views
7

我有一个表到MySQL那就是TextField类型(django的)使用JSONField。 这是我的模型看起来如何Django的(JSONField)和tastypie

from django.db import models 
from json_field import JSONField 

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

我通过tastypie发送的值是

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

到数据库中,我可以看到

{"data":"value"} 

但随着卷曲retrive数据,当我得到像这样

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

我能做些什么来没有蟒蛇u'field”表示到tastypie的输出?

谢谢!

+0

发现什么问题了 - 场连载从数据库Unicode和发送的是tastypie - 修复它我使用资源上的水合物方法“负载”它作为一个Python数据结构,并将其发送到tastypie。 – silviud

+3

如果您在回答这个问题的共同解决方案的代码,这将是很好。然后请将其标记为已接受的答案。 –

回答

4

我解决了这个问题,像这样:

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已经为我做了,但是,这个工程。如果有更好的解决方案,我很乐意。

+5

您不需要执行数据库查询,因为您的'Requirement'对象已经在'bundle.obj'中。 你可以简化你的解决方案 def dehydrate_user_inputs(self, bundle): return json.dumps(bundle.obj.user_inputs) tcmb

+1

@tcmb我相信你的评论是不正确的(至少在tastypie 0.11.1)。当你脱水时,JSON对象已经被转换为unicode(我假设为tastypie)。因此,要在脱水时解决这个问题,您需要按照kvnn的说法重新阅读。看到我的答案另一种方法(水化点解决它)。 –

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() 
1

使用DictField

obj = fields.DictField(attribute='obj') 
+0

继续显示,总是值得向下滚动并查看StackOverflow上的其他答案。这是一个很好的答案。我以前使用过'obj = fields.ListField(attribute ='obj')',但是对于像数据这样的数组,这正是我需要更多字典的数据。 – teewuane

4

你看到的是由Tastypie治疗造成的错误JSONField就像一个TextArea,并在返回i之前调用对象JSONField返回的str() t给来电者。

另一种方法是使用fields.ApiFields为JSONField。这工作,因为fields.ApiFields不上或者在(水合物())或出路的方式进行任何转换(转换())。这正是我们想要的 - 底层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')