首页 > 解决方案 > 如果存在,Django OneToOne Reverse Relation 会给出 RelatedObjectDoesNotExist

问题描述

我有以下型号

class SimulationStatus(models.Model):
    simulation = models.ForeignKey(Simulation, on_delete=models.CASCADE)
    name = models.CharField(
        max_length=80,
        choices=SimStatusOptions.to_sequence()
    )
    # Simulation time
    time = models.PositiveIntegerField(
        null=True, blank=True,
        verbose_name="time (in seconds)",
        help_text="simulation time in seconds"
    )

    # Field to track the active_status
    active_simulation = models.OneToOneField(
        Simulation, on_delete=models.CASCADE, related_name='active_status',
        null=True, blank=True
    )


class Simulation(models.Model):
    """
    Simulation model
    """
    uuid = models.UUIDField(default=uuid.uuid4)
    organisation = models.ForeignKey(
        Organisation, on_delete=models.CASCADE, null=False, blank=False
    )
    user = models.ForeignKey(
        User, on_delete=models.CASCADE, null=False, blank=False
    )

active_status即使实例确实存在 ,反向查找也会引发异常。

from api.simulations.models import Simulation
s = Simulation.objects.get(id=852)
s.active_status
# exception
---------------------------------------------------------------------------
RelatedObjectDoesNotExist                 Traceback (most recent call last)
<ipython-input-11-bbd6df757cc6> in <module>
----> 1 s.active_status

/usr/local/lib/python3.7/site-packages/django/db/models/fields/related_descriptors.py in __get__(self, instance, cls)
    413                 "%s has no %s." % (
    414                     instance.__class__.__name__,
--> 415                     self.related.get_accessor_name()
    416                 )
    417             )

RelatedObjectDoesNotExist: Simulation has no active_status.

from api.simulations.statuses.models import SimulationStatus
ss = SimulationStatus.objects.get(simulation=s)
ss
<SimulationStatus: created 0 sec, simulation: weir>

我真的不明白为什么会这样。我读过这篇文章,但我的关系不是空的。

标签: python-3.7django-2.x

解决方案


我有类似的问题,在我的情况下,我正在保存一个实例,但它不是反向添加的,因此是片面的关系。我记得这是由我删除并重新建模的应用程序引起null=True, blank=True的。OneToOneField


推荐阅读