Включить весь объект внешнего ключа при получении объекта - PullRequest
3 голосов
/ 01 октября 2019

В настоящее время я пытаюсь перенести функциональность объектных отношений с бэкэнда php на бэкэнд с python. В приложении php у вас был такой вызов:

~api/v1/cats/5b40b6eb-538f-a015-9196-1cc63cf8d7ae

Это вернуло бы результат, подобный следующему:

{
    id: "5b40b6eb-538f-a015-9196-1cc63cf8d7ae",
    name: "mittens",
    hatId: "0845de76-9d68-cfee-0ebb-473ccddf16bc",
}

Функциональность, которую я пытаюсь повторить, состоит в том, чтоесли бы вы добавили к вызову параметр include с именем внешнего объекта, например:

~api/v1/cats/5b40b6eb-538f-a015-9196-1cc63cf8d7ae?include=hat

, то он бы возвратил исходный объект, включая объект внешнего ключа

{
    id: "5b40b6eb-538f-a015-9196-1cc63cf8d7ae",
    name: "mittens",
    hatId: "0845de76-9d68-cfee-0ebb-473ccddf16bc",
    hat: {
        id: "0845de76-9d68-cfee-0ebb-473ccddf16bc",
        name: 'top hat',
    }
}

Все этоДо сих пор я сталкивался с select_related, HyperlinkedRelatedField и prefetch_related;кажется, что ни один из них не может получить вышеуказанный результат при реализации.

1 Ответ

0 голосов
/ 01 октября 2019

Я бы настоятельно рекомендовал использовать Django Rest Framework и особенно посмотреть на вложенные отношения .

Пример, приведенный в документации DRF, почти точно соответствует тому, что вы хотите сделать (хотяобратите внимание, это поле «один ко многим», а ваш пример - поле «один к одному»):

>>> album = Album.objects.create(album_name="The Grey Album", artist='Danger Mouse')
>>> Track.objects.create(album=album, order=1, title='Public Service Announcement', duration=245)
<Track: Track object>
>>> Track.objects.create(album=album, order=2, title='What More Can I Say', duration=264)
<Track: Track object>
>>> Track.objects.create(album=album, order=3, title='Encore', duration=159)
<Track: Track object>
>>> serializer = AlbumSerializer(instance=album)
>>> serializer.data
{
    'album_name': 'The Grey Album',
    'artist': 'Danger Mouse',
    'tracks': [
        {'order': 1, 'title': 'Public Service Announcement', 'duration': 245},
        {'order': 2, 'title': 'What More Can I Say', 'duration': 264},
        {'order': 3, 'title': 'Encore', 'duration': 159},
        ...
    ],
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...