Freqüentemente me pego querendo pegar o primeiro objeto de um queryyset no Django, ou retornar None
se não houver nenhum. Existem muitas maneiras de fazer isso que funcionam. Mas estou me perguntando qual é o mais eficiente.
qs = MyModel.objects.filter(blah = blah)
if qs.count() > 0:
return qs[0]
else:
return None
Isso resulta em duas chamadas ao banco de dados? Isso parece um desperdício. Isso é mais rápido?
qs = MyModel.objects.filter(blah = blah)
if len(qs) > 0:
return qs[0]
else:
return None
Outra opção seria:
qs = MyModel.objects.filter(blah = blah)
try:
return qs[0]
except IndexError:
return None
Isso gera uma única chamada ao banco de dados, o que é bom. Mas requer a criação de um objeto de exceção a maior parte do tempo, o que exige muita memória quando tudo o que você realmente precisa é de um teste-se trivial.
Como posso fazer isso com apenas uma chamada de banco de dados e sem agitar a memória com objetos de exceção?
first()
e last()
conveniência métodos: docs.djangoproject.com/en/dev/ref/models/querysets/#first
len()
em conjuntos de consultas, sempre use.count()
.