Django OneToOne字段,其中关系的一方是强制性的

d4so4syb  于 2023-05-19  发布在  Go
关注(0)|答案(1)|浏览(120)

假设我有这些模型:

class Space(models.Model):
    item = models.OneToOneField(Item, null=True, on_delete=models.CASCADE)

class Item(models.model):
    ...

一个空间可以包含一个项目,但它也可以是空的。另一方面,每个项目都必须有一个空间。它不可能存在于虚空中。
我可以在我的Item模型中创建一个field.space(null=False),但是这样一来,Space.container就不能为空(在创建/查询它们时会引发RelatedObjectDoesNotExist异常)。
处理这些异常很麻烦。我宁愿让Space.container返回None(就像我当前的设置一样)。
是否有一种简单的方法可以使Item模型中的.space成为强制性的,而不是相反?

gojuced7

gojuced71#

我觉得这会让人觉得很古怪。因为这种情况的默认情况是处理异常。Here您的SpacePlace,您的ItemRestaurant
我建议使用建议的策略:给予Item一个强制的OneToOne_Field,称为space。然后,而不是错误处理去与链接的例子显示的替代方案:
你也可以使用hasattr来避免异常捕获:

space = Space.objects.all().first()
if hasattr(space, 'item'):
    # do your logic without handling the error ObjectDoesNotExist

我对其他答案很感兴趣!

转念一想:

还可以通过属性实现错误处理或上面显示的处理。

class Space(models.Model):
    # ...
    @property
    def item(self):
        try:
            return self._item
        except ObjectDoesNotExist:
            return None

class Item(models.model):
    item = models.OneToOneField(Item, null=False, on_delete=models.CASCADE, related_name='_item')

老实说,我从来没有尝试过,但为什么这不工作?
告诉我进展如何!

相关问题