/ / Django - Erro DoesNotExist - Como posso dizer para permitir isso? - django, django-modelos

Django - DoesNotExist Error - Como posso dizer para permitir isso? - django, django-models

Eu tenho dois modelos como este:

class Collar(models.Model):
num_tags = models.BigIntegerField()

class Dog(models.Model):
num_legs = models.BigIntegerField()
collar =  models.OneToOneField(Collar,null=True,blank=True)

Sempre que tento fazer algo como:

dog = Dog.objects.all()[0]
if dog.collar:
#do something ...

Eu recebo um erro DoesNotExist na linha: if dog.collar.

Como posso dizer ao Django que está tudo bem? Que um colar nem sempre existe e quero verificar sua existência sem provocar um erro?

Respostas:

2 para resposta № 1

Use um try..except quadra:

try:
if dog.collar:
# Do something
except Collar.DoesNotExist:
# Do something else

Além disso, nunca assuma que all() sempre retornará alguma coisa. Em circunstâncias ideais, com certeza, mas a vida nunca é ideal. Você precisa pegar o potencial IndexError com uma declaração como essa e tenha um plano de contingência em vigor:

try:
dog = Dog.ojbects.all()[0]
except IndexError:
# Contingency plan so website doesn"t explode

0 para resposta № 2

Eu suspeito que a definição do seu modelo mudou desde que você criou suas tabelas usando manage.py syncdb.

Sua inicial Dog o modelo provavelmente se parecia com:

class Dog(models.Model):
num_legs = models.BigIntegerField()
collar =  models.OneToOneField(Collar)

Então, você criou suas tabelas usando manage.py syncdb, que criou o Dog e Collar tabelas de modelo.

Finalmente, você decidiu Dog.collar deve ser opcional para permitir construções como:

dog = Dog.ojbects.all()[0]
if dog.collar:
#do something ...

e modificou seu modelo para:

class Dog(models.Model):
num_legs = models.BigIntegerField()
collar =  models.OneToOneField(Collar,null=True,blank=True)

atualize seus modelos usando manage.py syncdb e foi pego com o erro clássico no Django por causa de um comando desabilitado: o syncdb comando não sincroniza tabelas com as definições de modelo, isto cria as tabelas.

Eu suspeito que, se você soltar as tabelas associadas a Dog e execute novamente syncdb, seu código cortado começará a funcionar.


-2 para resposta № 3

Você verificou isso?

if getattr(dog, collar):

E uma das maneiras possíveis --- derivadas do OneToOneField com a substituição de .to_python () adicionando o bloco try / except.