Bir Django QuerySet'i diktler listesine nasıl dönüştürebilirim?


122

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:


178

.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.


7
evet 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 .
dm03514

10
bu aslında bir liste
döndürmüyor

Ayrıca, nesnenizin örnek yöntemlerinin sonuçlarını da 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 ?!
Asara

34

.values()Yöntem size türünde bir sonuç dönecek ValuesQuerySetgenellikle çoğu durumda ne ihtiyaç vardır.

Ancak isterseniz, ValuesQuerySetaş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_resultve actual_resultaynı tipte olmalıdır (örneğin Sözlük).

actual_result = some_function()
expected_result = {
    # dictionary content here ...
}
assert expected_result == actual_result

17
Veya bununla listeye dönüştürmeyi basitleştirebilirsinizlist(result)
Adiyat Mubarak

12

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 ...


Görünüşe göre onu çalıştırdım data = list( blogs )ve sonra json.dumps( data ). Bir dizi javascript tarafında bir grup nesne ile çıkar, ayrıştırmaya gerek yoktur.
Arthur Tarasov

3

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- bir QuerySetdö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.


2

Listeye Yayınla yazın

    job_reports = JobReport.objects.filter(job_id=job_id, status=1).values('id', 'name')

    json.dumps(list(job_reports))

1

values()Sorgu yaptığınız Django model alanından aldığınız diktede metodu kullanabilir ve daha sonra her alana bir indeks değeri ile kolayca erişebilirsiniz.

Böyle deyin -

myList = dictOfSomeData.values()
itemNumberThree = myList[2] #If there's a value in that index off course...


0

Basitçe söylemek gerekirse list(yourQuerySet).


2
Bu size bir sözcük listesi değil, nesnelerin bir listesini verir.
Flimm

0

Model_to_dict kullanarak bir işlevi aşağıdaki gibi tanımlayabilirsiniz:

def queryset_to_dict(qs,fields=None, exclude=None):
    my_array=[]
    for x in qs:
        my_array.append(model_to_dict(x,fields=fields,exclude=exclude))
    return my_array
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.