Quero ver se existe um ID no banco de dados sem obter a instância do banco de dados. E quero acionar uma exceção DoesNotExist se ela não existir. Isso é o que estou fazendo atualmente:
MyModel.objects.get(pk=my_model_id)
mas existe uma alternativa mais eficiente, mas clara?
Além disso, para uma chamada para um endpoint, é comum retornar um 404 se o id do recurso não for encontrado no banco de dados. Isso pode ser conseguido adicionando um manipulador de erros que captura todas as exceções DoesNotExist e retorna um 404 com a mensagem de exceção. Mas também é comum exigir apenas um campo da instância do modelo.
Então é assim que é a maneira eficiente:
if not MyModel.objects.exists(pk=my_model_id):
raise DoesNotExist()
item = MyModel.objects.filter(pk=my_model_id).values_list("item", flat=True)[0]
Mas faço isso porque o código acima é muito detalhado e pouco claro:
item = MyModel.objects.get(pk=my_model_id).item
O mais eficiente seria usar exist() . Ele retorna apenas um booleano, mas não gera um ObjectDoesNotExist. Os documentos também mencionam:
Se precisar de apenas um ou alguns campos recomendo que faça uma consulta normal. Isso deve satisfazer todos os seus requisitos.
Isso produz a seguinte instrução SQL limpa e simples:
Isso também gerará um erro
MyModel.DoesNotExist
se nenhum objeto puder ser encontrado.