我正在使用带有Rest Framework和json-api的Django 1.8.3(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):
[...]
Run Code Online (Sandbox Code Playgroud)
现在的问题是,这种关系可能是"空的".从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.
Run Code Online (Sandbox Code Playgroud)
编辑:我的主要问题是,因为我正在使用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")
Run Code Online (Sandbox Code Playgroud)
我给你的例子与框架中的设计决策有关,而不是错误.此外,重要的事实并不是它们是新实例,而是它们有空引用(或者没有O2O分别引用它们).摘要:
clean(self)并且用户可能没有填充此类字段,并且您将检索它.这同样适用于OneToOne.