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

标签 python django model one-to-one

现在我使用的是 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/

相关文章:

python - 如果找不到属性,如何使 XPath 在 Python 中返回 'None'?

php - 拉拉维尔 5.2 : Order Models by Pivot table field

r - 使用其他自变量的所有可能组合获取许多模型中特定变量的 p 值

ruby - 使用 Rails 3 从现有表生成模型

python - 在 SciKit Learn 算法中将数据放入 DataFrame 会产生不同的结果

使用for循环打印python金字塔图案

python - 类型错误 : unsupported operand type(s) for +=: 'builtin_function_or_method' and 'int'

Django 静态文件未在浏览器中更新

python - Django 模板模块导入错误

Django Multi-Tenancy : how to customize django setting "ACCOUNT_EMAIL_VERIFICATION" per tenant?