2013-01-17 133 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')