2011-07-06 209 views
15

我試圖在Django中使用ValuesQuerySet功能來將從查詢返回的字段數限制爲僅需要的那些字段數。我想序列化這個數據集一個JSON對象然而,Django一直拋出一個錯誤。下面,我包括我的代碼和錯誤我收到:將django ValuesQuerySet轉換爲json對象

objectList = ConventionCard.objects.values('fileName','id').filter(ownerUser = user) 
data = serializers.serialize('json', objectList) 
return HttpResponse(data, mimetype='application/javascript') 

的錯誤:

Exception Type:  AttributeError 
Exception Value: 'dict' object has no attribute '_meta' 
Exception Location:  C:\Python27\lib\site-packages\django\core\serializers\base.py in serialize, line 41 

謝謝!

+0

爲什麼你使用'values()'?這使得'dict'對象不易被序列化。 –

+1

我不想要我的整個對象。我只想要兩個領域。價值觀似乎是這樣做的方式。有沒有更好的辦法? –

+0

由於「價值」不起作用,因此認爲它「似乎是實現這一目標的方式」並非如此。如果你只需要兩個字段,請**更新**問題非常非常清楚。這個問題並不清楚。 –

回答

12

使用查詢集,而不是嘗試在你的價值觀subsetting the fields列表通過serialize方法:

from django.core import serializers 
objectQuerySet = ConventionCard.objects.filter(ownerUser = user) 
data = serializers.serialize('json', objectQuerySet, fields=('fileName','id')) 
+0

這工作就像一個魅力。謝謝! –

+14

不理想,因爲查詢在只需要兩個字段時將所有列數據拉出。 – Aaron

+0

當我嘗試這件事時,我注意到,serializers.serialize'fields'選項沒有選擇相關模型的列/字段。任何人都面對同樣的情況? –

30

鑄ValuesQuerySet到列表第一:

query_set = ConventionCard.objects.values('fileName','id').filter(ownerUser = user) 

list(query_set) 

卸下values呼叫通過ARS原因的建議經理要從表格中取出所有列,而不是隻有你需要的兩列。

+3

明智的答案。精美的作品。 –

+0

調用Python對象時超出最大遞歸深度... –

+0

它在我的環境(Python 3.4,Django 1.8.3)中不起作用。 –

1

我想補充我已經發現了幾個細節:

當我試圖@ars答案指定的字段,如:

s_logs = serializers.serialize("json", logs, fields=('user', 'action', 'time')) 

我得到這個:

[{"pk": 520, "model": "audit.auditlog", "fields": {"user": 3, "action": "create", "time":"2012-12-16T12:13:45.540"}}, ... ] 

哪不是我想要的值的簡單序列化。

因此,我嘗試了@Aaron提出的解決方案,將valuesqueryset轉換爲列表,由於默認編碼器無法處理浮動或日期時間對象,因此第一次無法工作。

所以我用@Aaron解決辦法,但使用的是傳遞它作爲一個kwarg到simplejson.dumps()使用Django的串行器(DjangoJSONEncoder)的JSON編碼器,像這樣:

s_logs = list(logs.values('user', 'ip', 'object_name', 'object_type', 'action', 'time')) 

return HttpResponse(simplejson.dumps(s_logs, cls=DjangoJSONEncoder), mimetype='application/javascript') 
+0

如果你使用simplejson> 2.1,看看這個問題:https://github.com/simplejson/simplejson/issues/37 鑑於這個問題,可能必須繼承'simplejson.JSONEncoder'而不是'json.JSONEncoder' – defbyte

6

我繼續得到「」 dict'對象在使用上面的list()方法時沒有屬性'_meta'「錯誤。然而,我發現this snippet是伎倆

def ValuesQuerySetToDict(vqs): 
    return [item for item in vqs] 

# Usage 
data=MyModel.objects.values('id','title','...','...') 
data_dict = ValuesQuerySetToDict(data) 
data_json = simplejson.dumps(data_dict) 
+0

它的工作,謝謝! –

+0

在Django 1.5中,'simplejson'模塊被[刪除](https://docs.djangoproject.com/en/1.7/releases/1.5/#django-utils-simplejson)。另一種方法是簡單地「導入json」,然後使用「json.dumps(data_dict)」,答案如預期。 –