Qual é o idioma recomendado para verificar se uma consulta retornou algum resultado?
Exemplo:
orgs = Organisation.objects.filter(name__iexact = 'Fjuk inc')
# If any results
# Do this with the results without querying again.
# Else, do something else...
Suponho que existem várias maneiras diferentes de verificar isso, mas eu gostaria de saber como um usuário experiente do Django faria isso. A maioria dos exemplos nos documentos ignora o caso em que nada foi encontrado ...
django
django-queryset
Niklas
fonte
fonte
list
resultado, se houver registros. O código atingirá o banco de dados apenas uma vez. Se eles usassemexist()
oucount()
primeiro verificassem se haveriam registros retornados, estariam acessando o banco de dados duas vezes (uma vez para verificar, uma vez para obter os registros). Esta é uma situação específica. Não implica que, no caso geral , o método preferido para saber se a consulta irá retornar registros é para uso nãoif queryset:...
if not my_objects:
para demonstrar que é assim que eles fazem nos documentos. Tudo o mais é totalmente irrelevante, por isso não entendo seu argumento. Eles poderiam fazer mil perguntas e ainda assim seria totalmente irrelevante, pois esse não é o objetivo desta resposta, com a qual deixo claro que concordo.get_object_or_404
funciona, não uma maneira preferida de verificar se existe algum elemento em um conjunto de consultas. Fazer list () em um conjunto de consultas buscará todos os objetos em um conjunto de consultas, o que seria pior do que consultar duas vezes se houver muitas linhas retornadas..exists()
é mais eficiente se o qs não for avaliado.Desde a versão 1.2, o Django possui o QuerySet. Existe o método () que é o mais eficiente:
Mas se você avaliar o QuerySet de qualquer maneira, é melhor usar:
Para mais informações, leia a documentação QuerySet.exists () .
fonte
.get
não retorna um conjunto de consultas. Retorna um objeto. Portanto, pesquise no googleSe você possui um grande número de objetos, isso pode (às vezes) ser muito mais rápido:
Em um projeto em que estou trabalhando com um banco de dados enorme,
not orgs
tem mais de 400 ms eorgs.count()
250ms. Nos meus casos de uso mais comuns (aqueles em que existem resultados), essa técnica geralmente reduz isso para menos de 20ms. (Um caso que encontrei foi o 6.)É possível que demore muito mais, dependendo da distância que o banco de dados deve procurar para encontrar um resultado. Ou ainda mais rápido, se encontrar um rapidamente; YMMV.
EDIT: Este vai muitas vezes ser mais lento do que
orgs.count()
se o resultado não for encontrado, especialmente se a condição que você está filtrando é rara; como resultado, é particularmente útil nas funções de exibição nas quais você precisa garantir que a exibição exista ou lançar o Http404. (Onde, seria de esperar, as pessoas estão pedindo URLs que existem com mais frequência do que não).fonte
Para verificar o vazio de um conjunto de consultas:
ou você pode procurar o primeiro item em um conjunto de consultas, se ele não existir, retornará
None
:fonte
if orgs.exists()
foi coberto por uma resposta que foi fornecida cerca de 5 anos antes desta. A única coisa que essa resposta traz para a mesa que talvez seja nova éif orgs.first()
. (Mesmo isso é discutível: é substancialmente diferente de fazer oorgs[0]
sugerido há cerca de 5 anos também?) Você deveria desenvolver essa parte da resposta: quando alguém iria querer fazer isso em vez das outras soluções propostas anteriormente?A maneira mais eficiente (antes do django 1.2) é esta:
fonte
Eu discordo do predicado
Deveria ser
Eu estava tendo o mesmo problema com um conjunto de resultados bastante grande (~ 150k resultados). O operador não está sobrecarregado no QuerySet; portanto, o resultado é realmente descompactado como uma lista antes da verificação. No meu caso, o tempo de execução diminuiu três ordens.
fonte
Você também pode usar isso:
if(not(orgs)): #if orgs is empty else: #if orgs is not empty
fonte