Preciso verificar se existe um objeto e retornar o objeto, então com base nisso realizo ações. Qual é a maneira certa de fazer isso sem retornar um 404?
try:
listing = RealEstateListing.objects.get(slug_url = slug)
except:
listing = None
if listing:
django
django-views
Rasiel
fonte
fonte
if listing:
deve ser umelse:
.Respostas:
Eu não usaria o wrapper 404 se você não recebesse um 404. Isso é um uso indevido de intenção. Apenas pegue o DoesNotExist, em vez disso.
fonte
exists()
se você precisar fazer algo com o objeto.values_list('id', flat=True)
. se eu preciso apenas ver se existelisting = RealEstateListing.objects.values_list('id', flat=True).get(slug_url=slug)
RealEstateListing.DoesNotExist
se refere ao modelo, e não ao objeto em si. Por que não éRealEstateListing.objects.get(slug_url=slug).DoesNotExist
?Você também pode fazer:
Às vezes é mais claro usar o
try: except:
bloco e outras vezes uma linhaexists()
torna o código mais claro ... tudo depende da lógica da sua aplicação.fonte
exists()
não funciona comget()
, certo?get()
mais tarde, ele enviará uma segunda consulta ao banco de dados.try-except
maisexists()
.fonte
if listing:
.exists()
. Acho que é uma boa ideia no SO ter várias respostas diferentes sobre como fazer as coisas. Talvez seja melhor para quem também deseja utilizar o objeto caso ele exista. Eu não faria nenhuma regra se try / except devesse ser evitado ou não. Às vezes é bom e às vezes é ruim, por exemplo, se você deseja apenas fazer um código muito compacto.Eu faria da seguinte forma:
Não vejo necessidade de try / catch. Se houver potencialmente vários objetos no resultado, use first () conforme mostrado pelo usuário Henrik Heino
fonte