我在模型上定义了一对一的关系。让我们调用父模型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执行此操作而不是捕获异常。
答案 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
。