这段代码在django/db/models/fields.py中,它创建/定义了一个异常吗
类ReverseSingleRelatedObjectDescriptor(六个,带有_元类(重命名ReminateRadeObjectDescriptorMethods)):
#此类提供了生成相关对象的功能
#管理器作为模型类上的属性提供,用于具有
#定义相关字段的类上的单个“远程”值。
#在“choice.poll”示例中,poll属性是
#ReverseSingleRelatedObjectDescriptor实例。
def u u初始(自我,带rel的字段):
self.field=带\u rel的字段
self.cache\u name=self.field.get\u cache\u name()
@缓存的不动产
def RelatedObjectsDoesNotExist(自):
#无法在初始化时创建异常,因为
#相关模型可能尚未解决`对`的关系可能仍然存在
#字符串模型引用。
返回类型(
str('relatedObjectsDoesNotExist'),
(self.field.rel.to.DoesNotExist,AttributeError),
{}
)
这在django/db/models/fields/related.py中,它引发了上述异常:
def\uuuu get\uuuu(self、instance、instance\u type=None):
如果实例为“无”:
回归自我
尝试:
rel_obj=getattr(实例,self.cache_名称)
除属性错误外:
val=self.field.get_local_related_值(实例)
如果val中没有:
rel_obj=无
其他:
params=dict(
(rh_field.attname,getattr(实例,lh_field.attname))
对于lh_字段,在self.field.related_字段中为rh_字段)
qs=self.get\u queryset(实例=instance)
extra\u filter=self.field.get\u extra\u描述符\u filter(实例)
如果存在(额外过滤器,dict):
参数更新(额外过滤器)
qs=qs.filter(**参数)
其他:
qs=qs.filter(额外的过滤器,**参数)
#假设数据库强制使用外键,这不会失败。
rel_obj=qs.get()
如果不是self.field.rel.multiple:
setattr(rel_obj,self.field.related.get_cache_name(),实例)
setattr(实例,self.cache\u name,rel\u obj)
如果rel_obj为None且不是self.field.null:
提出与自我相关的对象不符合条件(
%s没有%s.“%(self.field.model.\u\u名称,self.field.name)
)
其他:
返回相关对象
问题在于此代码:
尝试:
val=getattr(对象,属性名称)
除related.ReversesingRelatedObjectDescriptor.RelatedObjectDoesNotExist外:
val=None#不捕获抛出的异常
除作为foo的例外情况外:
打印类型(foo)#此处捕捉,而非上方
我不会抓住那个例外
>&燃气轮机&燃气轮机;打印类型(foo)
<;类“django.db.models.fields.related.RelatedObjectDoesNotExist”>;
&燃气轮机&燃气轮机&燃气轮机;iInstance(foo,related.FieldDoesNotExist)
错误的
及
相关对象除外。RelatedObjectsDoesNotExister:
引发一个AttributeError:“模块”对象没有属性“RelatedObjectDoesNotExist”
>&燃气轮机&燃气轮机;isinstance(foo,related.reversesingrelatedObjectDescriptor.RelatedObjectDoesNotExist)
回溯(最近一次呼叫最后一次):
文件“<;字符串>;”,第1行,在<;碎片>;
TypeError:isinstance()arg 2必须是类、类型或类和类型的元组
这可能就是原因
如果您的相关模型名为Foo,您可以执行以下操作:
除Foo.DoesNotExist外:
Django在不可怕的时候是令人惊奇的RelatedObjectDoesNotExist是一个属性,返回在运行时动态计算的类型。该类型使用self.field.rel.to.DoesNotExist作为基类
根据Django文件:
实干家
异常模型。DoesNotExist
当预期的对象不存在时,ORM会引发此异常
建立例如,QuerySet.get()将在没有对象时引发它
为给定的查找找到Django提供了一个作为
每个模型类都可以标识无法访问的对象类
找到,允许您捕获特定模型类的异常异常是django.core.exceptions.ObjectDoesNotExist的子类
这就是让这一切发生的魔力。一旦建立了模型,self.field.rel.to.DoesNotExist就是该模型的不存在例外