2016-11-15 23 views
5

El ile bir Django queryset oluşturuyorum ve sadece DB'ye çarpmadan ortaya çıkan querset.query SQL'ini okumak için Django ORM'yi kullanmak istiyorum. Sadece benim kod tamamen Sorgu Kümesi kuruyor doğrulamak istediğinizDjango QuerySet'in değerlendirildiğini nasıl anlarım?

https://docs.djangoproject.com/en/1.10/ref/models/querysets/#when-querysets-are-evaluated

Ama ... ya eğer:

Django quersets tembel ve ben değerlendirilmektedir bir Sorgu Kümesi tetikleyen tüm oplar gördüğünü biliyorum bağırıyor ama ISN'T'imi değerlendiriyor ve DB'ime isabet ediyor mu? Aslında değerlendirmeden değerlendirilmediğini doğrulamak için kullanabileceğim queryset nesnesinde herhangi bir özellik var mı? Temel bir filtre gibi, model örnekleri listeleri iade veya dışlamak için bir select kullanmak Sorgu kümelerini için

+0

Sanırım, sanırım böyle bir kullanım durumu yok. Neden böyle bir özelliğe ihtiyacınız var? –

+0

SQL için Django ORM'in gerçekten hemen değerlendirmekten daha fazla oluşturduğu başka kullanımlarım var. – slumtrimpet

cevap

5

, _result_cache nitelik o varsa QuerySet değerlendirdi, ya sonuçları listesi edilmemiş ise None olduğunu. Halka açık olmayan özelliklerle ilgili olağan uyarılar geçerlidir.

Diğer querysets'ler için (sayın, silme, vb) basit bir yol olduğundan emin değilim. Belki veritabanı günlükleri izleyebilir ya DEBUG modunda çalışacak ve burada açıklandığı şekilde connection.queries kontrol edin: QuerySet ler değerlendirildiğinde bilmek isteyenler için https://docs.djangoproject.com/en/dev/faq/models/#how-can-i-see-the-raw-sql-queries-django-is-running

+0

Mükemmel, çok teşekkürler. – slumtrimpet

+0

@slumtrimpet - "SELECT" SQL'i kullanan tüm sorgular için değil, kayıt almak için kullanılan sorgularda çalıştığını bildirmek üzere güncelleştirildi. –

1

: onlar , dilimlenmiş iterated olduğunda bu, salamura veya önbelleğe, Repr() 'd, len()', listesini d() 'lı veya BOOL() 'ed. Bkz. https://docs.djangoproject.com/en/1.10/ref/models/querysets/#when-querysets-are-evaluated

+2

OP'nin bu soruya verdiği bağlantı budur. Soru "Django ne zaman bir queryset'i değerlendiriyor" diye sormuyor, soru "Bir queryset nesnesi verildiğinde, daha önce değerlendirilmiş olup olmadığını nasıl anlarım". Bu işlemler sırasında '_result_cache 'değerinin nasıl değiştiğini gözlemlemek için kaynak koduna bakın: https://github.com/django/django/blob/master/django/db/models/query.py –

+0

@PeterDeGlopper oh, evet, öyleyim üzgünüm, tamamen haklısın. Cevabı düzenleyeceğim, böylece Django'nun ne zaman değerlendirdiğini bilmek isteyen insanlara bilgi verecek. – feakuru