Django - DoesNotExist错误 - 我怎么能说允许这个?

时间:2011-06-06 14:23:32

标签: django django-models

我有两个这样的模型:

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这没关系?领子不会永远存在,我想检查它的存在而不会引发错误?

3 个答案:

答案 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创建了表格,这些表格创建了DogCollar模型表。

最后,您认为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()。