Bir Django QuerySet'i bir dikt listesine nasıl dönüştürebilirim? Buna bir cevap bulamadım, bu yüzden herkesin kullandığı ortak bir yardımcı işlevi kaçırıp kaçırmadığımı merak ediyorum.
Bir Django QuerySet'i bir dikt listesine nasıl dönüştürebilirim? Buna bir cevap bulamadım, bu yüzden herkesin kullandığı ortak bir yardımcı işlevi kaçırıp kaçırmadığımı merak ediyorum.
Yanıtlar:
.values()
Yöntemi kullanın :
>>> Blog.objects.values()
[{'id': 1, 'name': 'Beatles Blog', 'tagline': 'All the latest Beatles news.'}],
>>> Blog.objects.values('id', 'name')
[{'id': 1, 'name': 'Beatles Blog'}]
Not: Sonuç, QuerySet
çoğunlukla bir liste gibi davranan, ancak aslında bir örneği olmayan bir list
. list(Blog.objects.values(…))
Gerçekten bir örneğine ihtiyacınız varsa kullanın list
.
values()
alamazsınız, aynı şeyi yapmak için iyi bir yöntem olup olmadığını bilmiyorum, aynı values()
zamanda örnek yöntemlerini çağırmakla birlikte ?!
.values()
Yöntem size türünde bir sonuç dönecek ValuesQuerySet
genellikle çoğu durumda ne ihtiyaç vardır.
Ancak isterseniz, ValuesQuerySet
aşağıdaki örnekte gösterildiği gibi Python liste anlama özelliğini kullanarak yerel bir Python listesine dönüşebilirsiniz .
result = Blog.objects.values() # return ValuesQuerySet object
list_result = [entry for entry in result] # converts ValuesQuerySet into Python list
return list_result
Bir fonksiyonun beklenen dönüş değeri gerçek dönüş değeri eşleştiğini sen bu durumda hem assert için birim testleri ve gereğini yazıyoruz eğer yukarıda yararlı bulmaktadır expected_result
ve actual_result
aynı tipte olmalıdır (örneğin Sözlük).
actual_result = some_function()
expected_result = {
# dictionary content here ...
}
assert expected_result == actual_result
list(result)
Herhangi bir nedenle yerel veri türlerine ihtiyacınız varsa (örneğin, JSON serileştirme), bunu yapmanın hızlı ve kirli yoludur:
data = [{'id': blog.pk, 'name': blog.name} for blog in blogs]
Gördüğünüz gibi, listenin içindeki emri oluşturmak gerçekten KURU değil, bu yüzden birisi daha iyi bir yol biliyorsa ...
data = list( blogs )
ve sonra json.dumps( data )
. Bir dizi javascript tarafında bir grup nesne ile çıkar, ayrıştırmaya gerek yoktur.
Sözlüklerin neye benzemesi gerektiğini tam olarak tanımlamıyorsun, ama büyük olasılıkla kastediyorsun QuerySet.values()
. Gönderen resmi django belgelerinde :
Döndürür
ValuesQuerySet
- birQuerySet
döner sözlükleri ziyade model örnekli nesneleri daha bir iterable olarak kullanılan alt.Bu sözlüklerin her biri, model nesnelerin öznitelik adlarına karşılık gelen anahtarlarla bir nesneyi temsil eder.
Listeye Yayınla yazın
job_reports = JobReport.objects.filter(job_id=job_id, status=1).values('id', 'name')
json.dumps(list(job_reports))
Sen gerekmez DjangoJSONEncoder
ve list
senin yapmak Queryset
için json
, ref: Python JSON seri hale bir ondalık nesnesi
import json
from django.core.serializers.json import DjangoJSONEncoder
blog = Blog.objects.all().values()
json.dumps(list(blog), cls=DjangoJSONEncoder)
Basitçe söylemek gerekirse list(yourQuerySet)
.
values()
, döndürmek istediğiniz alanları bağımsız değişken olarak ileterek belirtirsiniz . Değerler bir dikt listesi veriyor gibi görünse de, aslında<class 'django.db.models.query.ValuesQuerySet'>
bir liste değil , a'ya dikkat edin .