Django:如何访问反向关系的对象id ?



假设我有这样的代码:

class Recipe(models.Model):
item = models.OneToOneField("Item", on_delete=CASCADE)
class Item(models.Model):
# ...

Recipe对象有item_id属性,但是Item对象没有recipe_id属性。是否有一种方法允许两个模型直接访问关系另一端的id ?

  • 请注意,由于一些外部原因(在这里解释并不有趣),我不能通过关系访问字段,因此recipe.id对我不可用。
  • 当然,一个解决方法可以是在Item对象上定义一个名为recipe_id的属性,它可以工作,但对我来说感觉不自然,而且有点重复,因为我需要在多个模型上对它做:
class Item(models.Model):
@property
def recipe_id(self) -> Optional[int]:
if self.recipe:
return self.recipe.id

可以参考一对一关系在本文档中:https://docs.djangoproject.com/en/dev/topics/db/queries/#backwards-related-objects

正如它所说的如果你在你的模型上定义了一个OneToOneField,那么该模型的实例将可以通过模型的属性访问相关的对象。

对于反向查询,一对一关系中的相关模型也可以访问Manager对象,但是该Manager表示单个对象,而不是对象集合

您可以访问菜谱中的item_id作为Recipe.objects.get(pk=1).item.id

access recipe_id from item asItem.objects.get(pk=2).recipe.id

但是如果配方id不存在(未映射),它将引发RelatedObjectDoesNotExist错误。您可以将其包含在try except块中。

try:
Item.objects.get(pk=2).recipe.id
except:
return None

相关内容

  • 没有找到相关文章

最新更新