gpt4 book ai didi

python - 检查 Django 中是否存在 OneToOne 关系

转载 作者:太空狗 更新时间:2023-10-29 17:24:28 25 4
gpt4 key购买 nike

现在我使用的是 django 1.6

我有两个模型与 OneToOneField 相关。

class A(models.Model):
pass

class B(models.Model):
ref_a = models.OneToOneField(related_name='ref_b', null=True)

先看我指出问题的代码:

a1 = A.objects.create()
a2 = A.objects.create()
b1 = B.objects.create()
b2 = B.objects.create(ref_a=a2)

# then I call:
print(a1.ref_b) # DoesNotExist Exception raised
print(a2.ref_b) # returns b2
print(b1.ref_a) # returns None
print(b2.ref_a) # returns a2

现在的问题是,如果我要检查一个A对象,判断它是否存在引用它的B对象。我该怎么办?

我尝试过的有效方法只是 try catch 异常,但还有其他更漂亮的方法吗?


我的努力:

1 - 下面的代码可以工作,但是太丑了!

b = None
try:
b = a.ref_b
except:
pass

2 - 我也尝试检查 a 中的属性,但没有工作:

b = a.ref_b if hasattr(a, 'ref_b') else None

小伙伴们有遇到同样的问题吗?求指点,谢谢!

最佳答案

所以您至少有两种方法可以检查它。首先是创建 try/catch block 来获取属性,其次是使用 hasattr

class A(models.Model):
def get_B(self):
try:
return self.b
except:
return None

class B(models.Model):
ref_a = models.OneToOneField(related_name='ref_b', null=True)

请尽量避免使用裸露的 except: 子句。它可以隐藏一些problems .

第二种方式是:

class A(models.Model):
def get_B(self):
if(hasattr(self, 'b')):
return self.b
return None

class B(models.Model):
ref_a = models.OneToOneField(related_name='ref_b', null=True)

在这两种情况下,您都可以毫无异常(exception)地使用它:

a1 = A.objects.create()
a2 = A.objects.create()
b1 = B.objects.create()
b2 = B.objects.create(ref_a=a2)

# then I call:
print(a1.get_b) # No exception raised
print(a2.get_b) # returns b2
print(b1.a) # returns None
print(b2.a) # returns a2

没有其他办法,因为抛出异常是 Django 的默认行为 One to One relationships .

这是官方文档中的处理示例。

>>> from django.core.exceptions import ObjectDoesNotExist
>>> try:
>>> p2.restaurant
>>> except ObjectDoesNotExist:
>>> print("There is no restaurant here.")
There is no restaurant here.

关于python - 检查 Django 中是否存在 OneToOne 关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25944968/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com