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 № 1Use 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.