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
для меня недоступен. - Конечно, обходным путем может быть определение свойства
recipe_id
на объектеItem
, это работает, но кажется мне неестественным, и немного повторяющимся, так как мне нужно делать это на нескольких моделях:
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 as Item.objects.get(pk=2).recipe.id
Но если идентификатор рецепта отсутствует (не сопоставлен), то возникнет ошибка RelatedObjectDoesNotExist
. которую можно заключить в блок try except.
try:
Item.objects.get(pk=2).recipe.id
except:
return None