假设我有这样的代码:
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