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
Вернуться на верх