Перевірка Django на наявність будь-якого запиту


87

У django як перевірити, чи існує якийсь запис для запиту

sc=scorm.objects.filter(Header__id=qp.id)

Так було зроблено у php

if(mysql_num_rows($resultn)) {
    // True condition
    }
else {
    // False condition
    }

Відповіді:


87

Використання count():

sc=scorm.objects.filter(Header__id=qp.id)

if sc.count() > 0:
   ...

Перевага над, наприклад, len()полягає в тому, що QuerySet ще не оцінено:

count()виконує SELECT COUNT(*)за кадром, тому вам слід завжди використовувати, count() а не завантажувати весь запис в об'єкти Python і викликати len() результат.

Маючи це на увазі, коли QuerySets оцінюються, варто прочитати.


Якщо ви використовуєте get(), наприклад scorm.objects.get(pk=someid), а об'єкт не існує, виникає ObjectDoesNotExistвиняток:

from django.core.exceptions import ObjectDoesNotExist
try:
    sc = scorm.objects.get(pk=someid)
except ObjectDoesNotExist:
    print ...

Оновлення: також можна використовувати exists():

if scorm.objects.filter(Header__id=qp.id).exists():
    ....

Повертає, Trueякщо QuerySet містить якісь результати, а Falseякщо ні. Це намагається виконати запит найпростішим і найшвидшим способом , але виконує майже той самий запит, що і звичайний запит QuerySet.


51
if scorm.objects.filter(Header__id=qp.id).exists()
Олександр Лебедєв

@Alex Lebedev: Так, цей метод буде доступний у Django 1.2. Дякую.
Фелікс Клінг,

183

Станом на Django 1.2 ви можете використовувати exists():

https://docs.djangoproject.com/en/dev/ref/models/querysets/#exists

if some_queryset.filter(pk=entity_id).exists():
    print("Entry contained in queryset")

25
Це має бути прийнятою відповіддю. Існує (), як правило, значно швидше, ніж count ().
frmdstryr

1
Це, здається, швидше, ніж .objects.get(pk=...)маршрут
Бред Соломон,

0

це спрацювало для мене!

якщо some_queryset.objects.all (). існує (): print ("ця таблиця не порожня")

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.