2011-07-06 17 views
15

Django'daki ValuesQuerySet özelliğini, sorgudan döndürülen alan sayısını yalnızca ihtiyacım olanlarla sınırlamak için kullanıyorum. Bu veriyi JSON nesnesini serileştirmek istiyorum. Ancak Django bir hata atmaya devam ediyor. Benim kod ve hata aşağıda yer verdik ben alırsınız:Bir django ValuesQuerySet öğesini bir json nesnesine dönüştürme

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

Hata:

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 

Teşekkür!

+0

Niçin 0 değerleri kullanıyorsunuz() '? Bu, 'dizgeyi' kolayca serileştirilemeyen nesneleri yapar. –

+1

Tüm nesnemi istemiyorum. Sadece iki alan istiyorum. Değerler bunu yapmanın yolu gibi görünüyor. Daha iyi bir yolu var mı? –

+0

"Değerler" çalışmadığından, "bunu yapmanın yolu gibi görünüyor" diyerek doğru olamaz. Sadece iki alan istiyorsanız, lütfen ** güncellemeyi ** soruyu çok, çok açık bir şekilde söyleyin. Bu soruda net değil. –

cevap

12

yerine Sorgu Kümesi kullanılarak serialize yöntemiyle senin değerlerinde subsetting the fields listesini deneyin:

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

Bu bir çekicilik gibi çalıştı. Teşekkür ederim! –

+14

İdeal değil, çünkü sorgu yalnızca iki alana ihtiyaç duyduğunda tüm sütun verilerini dışarı çekiyor. Bu şeyi denediğimde – Aaron

+0

, serializers.serialize 'fields' seçeneği, ilgili modellerin sütun/alanlarını seçmediğini fark ettim. Aynı kimseyle karşılaştı mı? –

30

ilk listeye ValuesQuerySet Cast:

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

list(query_set) 

values çağrıyı Çıkarma ars nedenleri önerdiği gibi Yönetici, tüm sütunları yalnızca ihtiyacınız olan iki yerine tablodan çeker. Ben @ars gibi alanlar belirterek cevaplarsanız çalıştı

:

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

Ben bu olsun:

+3

Parlak yanıt. Güzel çalışır. Python nesnesini çağırırken –

+0

maksimum yineleme derinliği aşıldı ... –

+0

Ortamımda çalışmıyor (Python 3.4, Django 1.8.3). –

1

Hemen bulduğum birkaç ayrıntı eklemek için

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

Hangi istediğim gibi değerlerin basit bir serileştirilmesi değildi.

Bu nedenle, varsayılan kodlayıcının yüzer veya datetime nesneleriyle baş edemediğinden, ilk defa çalışmayan değerler listesini bir listeye dönüştürerek @Aaron tarafından önerilen çözümü denedim.

yüzden böyle bir çözüm ancak simplejson.dumps() bir kwarg olarak ileterek Django'nın serileştiriciden (DjangoJSONEncoder) tarafından kullanılan JSON kodlayıcı kullanırken, @Aaron kullandı:

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

Eğer simplejson> 2.1 kullanıyorsanız, bu konuya bir göz atın: https://github.com/simplejson/simplejson/issues/37 Bu sorun göz önünde bulundurulduğunda, 'Simplejson.JSONEncoder' yerine subclass json.JSONEncoder' – defbyte

6

Elde devam bir "' dict 'nesnesinin, yukarıda liste() yöntemini kullanırken bir hata' _meta 'hatası yoktur. Ancak,

+0

Çalıştı, Teşekkürler! –

+0

'Simplejson' modülü Django 1.5'te [kaldırıldı] (https://docs.djangoproject.com/en/1.7/releases/1.5/#django-utils-simplejson) oldu. Alternatif olarak 'json' içe aktarılır ve daha sonra json.dumps (data_dict) kullanılır ve cevap beklendiği gibidir. –

İlgili konular