Yanıtlar:
Django querysets tembeldir. Bu, bir sorgunun veritabanına yalnızca sonucu özellikle istemeniz durumunda vuracağı anlamına gelir.
Bu nedenle, bir sorgunun sonucunu yazdırana veya gerçekten kullanana kadar, veritabanı erişimi olmadan daha fazla filtre uygulayabilirsiniz.
Aşağıda gördüğünüz gibi, kodunuz yalnızca son 10 öğeyi getirmek için yalnızca bir sql sorgusu yürütür.
In [19]: import logging
In [20]: l = logging.getLogger('django.db.backends')
In [21]: l.setLevel(logging.DEBUG)
In [22]: l.addHandler(logging.StreamHandler())
In [23]: User.objects.all().order_by('-id')[:10]
(0.000) SELECT "auth_user"."id", "auth_user"."username", "auth_user"."first_name", "auth_user"."last_name", "auth_user"."email", "auth_user"."password", "auth_user"."is_staff", "auth_user"."is_active", "auth_user"."is_superuser", "auth_user"."last_login", "auth_user"."date_joined" FROM "auth_user" ORDER BY "auth_user"."id" DESC LIMIT 10; args=()
Out[23]: [<User: hamdi>]
Aslında ben LIMIT 10
bu yüzden dilimleme Python değil veritabanında gerçekleşecek veritabanına verileceğini düşünüyorum .
Daha fazla bilgi için sınırlayıcı-sorgu kümelerine bakınız .
Görünüşe göre sorudaki çözüm artık Django 1.7 ile çalışmıyor ve bir hata veriyor: "Bir dilim alındıktan sonra sorgu yeniden sıralanamıyor"
Belgelere göre Python dilim sözdiziminin “adım” parametresini zorlayan https://docs.djangoproject.com/en/dev/topics/db/queries/#limiting-querysets Sorguyu değerlendirir. Bu şekilde çalışır:
Model.objects.all().order_by('-id')[:10:1]
Yine de sınır SQL veya Python dilimleri tüm sonuç dizisi idam yürütülürse merak ediyorum. Uygulama hafızasına dev listeler almak iyi değildir.
Evet. Sınırlı bir nesne alt kümesi almak istiyorsanız, aşağıdaki kodla yapabilirsiniz:
Misal:
obj=emp.objects.all()[0:10]
0 başlangıcı isteğe bağlıdır, bu nedenle
obj=emp.objects.all()[:10]
Yukarıdaki kod ilk 10 örneği döndürür.
Diğer faydalı cevaplara bir ekleme ve gözlem olarak, [:10]
dilimleme olarak yapmanın listenin ilk 10 öğesini döndüreceğini fark etmek önemlidir. , son 10 değil ...
Son 10'u almak için [-10:]
bunun yerine yapmalısınız ( buraya bakın ). Bu , öğeleri tersine çevirmek için order_by('-id')
ile kullanmaktan kaçınmanıza yardımcı olacaktır -
.
Product.objects.filter(~Q(price=0))[-5:]
bana aynı hataya neden oluyor: "Negatif indeksleme desteklenmiyor."