假设上课:
class M(models.Model):
rel = models.OneToOneField(X,on_delete=models.CASCADE)
现在,如果我想通过X的实例x访问实例M,我会写:
x=X.objects.all().first()
x.m
但是,如果没有与x相关的M实例,则会抛出错误。 如何使其返回None而不是错误。
编辑: 这与OneToOneField有关,而不是一般的过滤
答案 0 :(得分:3)
有几个人要求这样做。请参阅示例ticket #10227。但我认为这不会很快改变(非常)(如果有的话)。编写了很多代码,假设如果不存在反向对象,则会出现错误,只是更改该行为可能会破坏几个Django部分,插件,Web服务器等。
因此,我认为“学会与它共存”可能更好(至少目前为止)。然而,我们可以采取一些措施来缓解疼痛,并使用“ protected ”related_name
:
class M(models.Model):
rel = models.OneToOneField(X, related_name='_m', on_delete=models.CASCADE)
然后我们可以向@property
模型添加X
:
class X(models.Model):
@property
def m(self):
try:
return self._m
except M.DoesNotExists:
return None
如果我们自己定义X
模型,或者我们可以使用 monkey patching 将这些属性添加到已在库中定义的类等,我们可以使用此方法。 / p>
所以现在我们可以(安全地)使用some_x.m
。但是,这不会解决我们所有的麻烦,例如过滤等等。上述情况不起作用。
答案 1 :(得分:0)
除@WillemVanOnsem答案外,您还可以使用getattr
内置函数代替try / except:
getattr(x, 'm', None)
答案 2 :(得分:0)
您可以随时使用
hasattr(model_instance,attribute)
如果没有属性,则返回false;如果没有属性,则返回true
您可以检查
hasattr(x,m)
如果给定X带有m,则返回true,否则返回false