Quando peço ao gerente de modelo que obtenha um objeto, ele aumenta DoesNotExist
quando não há nenhum objeto correspondente.
go = Content.objects.get(name="baby")
Em vez de DoesNotExist
, como posso ter go
sido None
?
python
django
django-queryset
TIMEX
fonte
fonte
SomeModel.objects.filter(foo='bar').first()
isso para retornar a primeira correspondência, ou Nenhuma. Ele não falhará se há vários casos comoqueryset.get()
filter().first()
, acho que a exceção é o caminho a percorrer.Desde o django 1.6, você pode usar o método first () assim:
fonte
De documentos do django
Você pode capturar a exceção e atribuir
None
à saída.fonte
Você pode criar uma função genérica para isso.
Use isto como abaixo:
go será None se nenhuma entrada corresponder a outra, retornará a entrada Content.
Nota: Isso gerará a exceção MultipleObjectsReturned se mais de uma entrada for retornada para name = "baby"
fonte
Você pode fazer assim:
Agora a variável go pode ser o objeto que você deseja ou Nenhum
Ref: https://docs.djangoproject.com/en/1.8/ref/models/querysets/#django.db.models.query.QuerySet.first
fonte
Para facilitar, aqui está um trecho do código que escrevi, com base nas entradas das maravilhosas respostas aqui:
E então no seu modelo:
É isso aí. Agora você tem MyModel.objects.get () e MyModel.objetcs.get_or_none ()
fonte
você poderia usar
exists
com um filtro:apenas uma alternativa para se você só quer saber se existe
fonte
Note: If you only want to determine if at least one result exists (and don’t need the actual objects), it’s more efficient to use exists().
exists()
será usado com aif
cláusula antes de buscar o objeto, causando um duplo golpe no banco de dados. Ainda manterei o comentário, caso isso ajude outra pessoa.Lidar com exceções em diferentes pontos de suas visualizações pode ser realmente complicado. Que tal definir um Model Manager personalizado, no arquivo models.py, como
e depois incluí-lo na classe Model de conteúdo
Desta forma, pode ser facilmente tratado nas visualizações, isto é,
fonte
return self.get(**kwargs)
ele funcione para mim. Para não dizer que há algo errado com a resposta, apenas uma dica para quem tenta usá-lo com versões posteriores (ou com o que mais o impediu de funcionar para mim).É uma daquelas funções irritantes que você talvez não queira reimplementar:
fonte
get_object_or_None
mas descobri que ele ainda aumentaMultipleObjectsReturned
se houver mais de um objeto. Portanto, o usuário pode considerar cercar com atry-except
(que a própria função já possuitry-except
).Se você deseja uma solução simples de uma linha que não envolva manipulação de exceção, instruções condicionais ou um requisito do Django 1.6+, faça o seguinte:
fonte
Eu acho que não é uma má ideia usar
get_object_or_404()
Este exemplo é equivalente a:
Você pode ler mais sobre get_object_or_404 () na documentação online do django.
fonte
A partir do django 1.7, você pode fazer o seguinte:
A vantagem de "MyQuerySet.as_manager ()" é que ambos os seguintes funcionarão:
fonte
Aqui está uma variação da função auxiliar que permite passar opcionalmente em uma
QuerySet
instância, caso você queira obter o objeto exclusivo (se presente) de um conjunto de consultas que não seja o conjunto deall
consultas de objetos do modelo (por exemplo, de um subconjunto de itens filhos pertencentes a um instância pai):Isso pode ser usado de duas maneiras, por exemplo:
obj = get_unique_or_none(Model, **kwargs)
conforme discutido anteriormenteobj = get_unique_or_none(Model, parent.children, **kwargs)
fonte
Sem exceção:
Usando uma exceção:
Há um pouco de argumento sobre quando alguém deve usar uma exceção em python. Por um lado, "é mais fácil pedir perdão do que permissão". Embora eu concorde com isso, acredito que uma exceção deve permanecer, bem, a exceção e o "caso ideal" deve ser executado sem atingir uma.
fonte
Podemos usar a exceção interna do Django, anexada aos modelos nomeados como
.DoesNotExist
. Portanto, não precisamos importarObjectDoesNotExist
exceção.Em vez disso:
Nós podemos fazer isso:
fonte
Este é um imitador de get_object_or_404 do Django, exceto que o método retorna None. Isso é extremamente útil quando precisamos usar a
only()
consulta para recuperar apenas determinados campos. Este método pode aceitar um modelo ou um conjunto de consultas.fonte
Talvez seja melhor você usar:
fonte