Django OneToOne错误

时间:2018-06-07 16:52:37

标签: django django-models one-to-one

假设上课:

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有关,而不是一般的过滤

3 个答案:

答案 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