gpt4 book ai didi

python - Django OneToOne 反向关系在空时不存在

转载 作者:太空宇宙 更新时间:2023-11-03 12:46:30 25 4
gpt4 key购买 nike

我将 Django 1.8.3 与 Rest Framework 和 json-api ( https://github.com/django-json-api/django-rest-framework-json-api) 结合使用。我有这种 OneToOne 关系:

class CalendarBlock(models.Model):
vehiclecheck = models.OneToOneField('vehiclecheck.VehicleCheck',
null=True, blank=True,
related_name='calendar_block'
)

[...]


class VehicleCheck(models.Model):
[...]

现在的问题是,关系可以是“空”的。从 CalendarBlock 到 Vehiclecheck 时,哪个有效,但不是反向关系:

In [1]: from vehiclecheck.models import VehicleCheck

In [2]: from dispo_calendar.models import CalendarBlock

In [3]: CalendarBlock.objects.first().vehiclecheck

In [4]: # no problem here

In [5]: VehicleCheck.objects.first().calendar_block
Out[5]: <CalendarBlock: CalendarBlock object>

In [6]: VehicleCheck.objects.get(pk=398).calendar_block
---------------------------------------------------------------------------
RelatedObjectDoesNotExist Traceback (most recent call last)
<ipython-input-6-65d3178686f5> in <module>()
----> 1 VehicleCheck.objects.get(pk=398).calendar_block

/home/sh/gitty/work/tcs_cardispo2_backend/.venv/lib/python3.5/site-packages/django/db/models/fields/related.py in __get__(self, instance, instance_type)
468 "%s has no %s." % (
469 instance.__class__.__name__,
--> 470 self.related.get_accessor_name()
471 )
472 )

RelatedObjectDoesNotExist: VehicleCheck has no calendar_block.

编辑:我的主要问题是因为我使用的是 rest_framework,所以我不能使用异常处理等,因为我没有显式调用访问数据。

最佳答案

Django 在 OneToOne 和 ForeignKey 相关字段方面存在一些问题。具体假设:

class A(Model):
# assume these models exist
b = ForeignKey(B, null=True)
c = ForeignKey(C)
d = OneToOneField(D, null=True, related_name="a")
e = OneToOneField(E, related_name="a")
  • 如果您想检索 A().b 或 A().d,您将得到 None。
  • 如果您想检索 A().c,则会引发 C.DoesNotExist 错误。
  • 如果您想检索 A().e,则会引发 E.DoesNotExist 错误。
  • 如果你想检索 B().a_set.all() 或 C().a_set.all(),你会得到一个没有元素的查询集。
  • 如果您想检索 D().a 或 E().a,则会引发 A.DoesNotExist 错误。

我给你的例子与框架中的设计决策有关,而不是错误。此外,重要的事实不是它们是新实例,而是它们具有 引用(或者没有 O2O 分别引用它们)。摘要:

  • 检索 null=False(命名参数的默认值)FK 字段将引发 target.DoesNotExist 如果该字段为 None(当然实例尚未保存,因为 None 不允许用于此类字段)。对于新创建的模型尤其如此,您正在 clean(self) 中验证它们的字段,并且用户可能没有填充此类字段,而您检索了它。这同样适用于 OneToOne。
  • 检索 OneToOne 的反面,当直接面具有(将具有)None 值时将引发 source.DoesNotExist 错误。

关于python - Django OneToOne 反向关系在空时不存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33610563/

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