我有两个这样的模型:
class Collar(models.Model):
num_tags = models.BigIntegerField()
class Dog(models.Model):
num_legs = models.BigIntegerField()
collar = models.OneToOneField(Collar,null=True,blank=True)
每当我尝试做类似的事情时
dog = Dog.objects.all()[0]
if dog.collar:
#do something ...
我在该行上收到了DoesNotExist错误:如果是dog.collar。
我怎么能告诉Django这没关系?领子不会永远存在,我想检查它的存在而不会引发错误?
答案 0 :(得分:2)
使用try..except
块:
try:
if dog.collar:
# Do something
except Collar.DoesNotExist:
# Do something else
此外,永远不要假设all()
将始终返回某些内容。在理想的情况下,当然,生活永远不会是理想的。您需要通过这样的声明来捕捉潜在的IndexError
,并制定应急计划:
try:
dog = Dog.ojbects.all()[0]
except IndexError:
# Contingency plan so website doesn't explode
答案 1 :(得分:0)
我怀疑自从您首次使用manage.py syncdb
创建表格后,您的模型定义已更改。
您的初始Dog
模型可能看起来像:
class Dog(models.Model):
num_legs = models.BigIntegerField()
collar = models.OneToOneField(Collar)
然后,您使用manage.py syncdb
创建了表格,这些表格创建了Dog
和Collar
模型表。
最后,您认为Dog.collar
应该是可选的,以允许构造如:
dog = Dog.ojbects.all()[0]
if dog.collar:
#do something ...
并将您的模型修改为:
class Dog(models.Model):
num_legs = models.BigIntegerField()
collar = models.OneToOneField(Collar,null=True,blank=True)
然后使用manage.py syncdb
更新了模型,由于命令错误,Django遇到了经典错误:syncdb
命令没有将表与模型定义同步 ,它创建表。
我怀疑如果您删除与Dog
关联的表格并重新运行syncdb
,则您的代码将会开始工作。
答案 2 :(得分:-2)
你检查过这个吗?
if getattr(dog, collar):
以及一种可能的方法---通过添加try / except块从OneToOneField派生并重写.to_python()。