如何检查对象关系是在不捕获DoesNotExist的情况下填充的

时间:2014-10-03 14:21:21

标签: django

我在模型上定义了一对一的关系。让我们调用父模型A和相关模型B.B不会总是存在。当我与A的实例交互时,如何确定B是否存在而不必捕获DoesNotExist?当我尝试访问B的实例(例如print a.b)时,我收到了DoesNotExist异常。当存在与其工作关系对应的DB行时。这是关于django 1.5。

简化模型定义(不以此形式测试):

class A:
    ...

class B:
    a = models.OneToOneField(A, related_name='a')
    name = models.TextField(...)

fields = ['b__name']
a = A.object.filter(pk=id).selected_related(*fields)
print(a.b)

表B具有a_id的外键。

我提出问题的原因是确定是否有更简洁的方法通过API执行此操作而不是捕获异常。

2 个答案:

答案 0 :(得分:1)

如果我理解正确,首先是属性" related_name"用于从反转的外键对象引用当前对象,因此模型定义应该类似于:

class A:
   ...

class B:
    a = models.OneToOneField(A, related_name='alias_for_b')
    name = models.TextField(...)

,验证码可以简单:

if hasattr(a, 'alias_for_b'):
    print(a.b) or print(a.alias_for_b)

希望这会有所帮助!!

答案 1 :(得分:0)

假设您拥有A a的实例。正确地说,您可以使用类似B(Python 3语法)的内容访问b print(a.b)的相关实例。如果可能没有相关项,并且您不希望用户收到错误,那么您需要将该调用包装到b。类似的东西:

try:
    print(a.b)
except:
    print('Nothing to see here')

在尝试呈现之前检查b的存在,如果不存在则不会这样做。

或者,你可以从另一个方向接近这个。给定一个实例a,您可以查找B.objects.filter(your_relation_name=a)。这种方式不会涉及任何错误捕获,只有空白的查询集,如果不存在这样的b