关于django:如何检查对象关系是在不捕获doesnotexist的情况下填充的

How to check object relation is populated without catching DoesNotExist

我在模型上定义了一对一的关系。让我们称之为父模型A,相关的模型B.B并不总是存在的。当我与A的一个实例进行交互时,我如何确定B是否存在而不必抓住实干主义者?当我试图访问B的一个实例(例如print a.b)时,我收到一个不受欢迎的异常。当有一个与关系相对应的db行时,它就会工作。这是Django 1.5。

我头脑中的简化模型定义(未在此表单中测试):

1
2
3
4
5
6
7
8
9
10
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有一个u id的外键。

我提出这个问题的原因是为了确定是否有一种更干净的方法通过API来实现这一点,而不是捕获一个异常。


如果我理解正确,首先使用属性"相关名称"从反向的外键对象引用当前对象,因此模型定义应该如下所示:

1
2
3
4
5
6
class A:
   ...

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

验证代码可以简单:

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

希望这有帮助!!


假设你有你的AA的实例。正如您正确地说的那样,您可以使用类似于print(a.b)的东西(python 3语法)访问BB的相关实例。如果可能没有相关的项目,并且您不希望用户收到错误,那么您需要将对B的调用包装在一些内容中。类似:

1
2
3
4
try:
    print(a.b)
except:
    print('Nothing to see here')

在试图呈现之前,它检查了B的存在,如果不存在,就不会这样做。

或者,您可以从另一个方向来处理这个问题。以A为例,可以查找B.objects.filter(your_relation_name=a)。这样就不需要捕捉任何错误,如果不存在这样的B,只需要一个空白的查询集。