как они выглядят: [https://gist.github.com/bim-ba/22c2327b256942d996afb8b91170639b#file-models-py]
Нужно их инициализировать, но проблема в том что они перекрестные.
Детали:
API по пути /api/clans/uid отдает JSON примерно следующего вида (допустим я обратился к `/api/clans/13`): [https://gist.github.com/bim-ba/22c2327b256942d996afb8b91170639b#file-apiclans-json]
API по пути /api/players/uid отдает JSON примерно следующего вида (допустим я обратился к `/api/players/444`): [https://gist.github.com/bim-ba/22c2327b256942d996afb8b91170639b#file-apiuser-json]
Например:
Я делаю запрос /api/clans/13 и получаю вот такой ответ:
[https://gist.github.com/bim-ba/22c2327b256942d996afb8b91170639b#file-apiclans-json]
[https://gist.github.com/bim-ba/22c2327b256942d996afb8b91170639b#file-main-py]
Можно заметить что API хоть и отдал информацию по каждому пользователю в клане, но отдал он эту информацию частично, ведь мы явно видим что отсутствуют поля bio и clan для всех пользователей. Из-за того что API отдает такую неполную информацию по пользователям, я не могу инициализировать массив users в классе Clans. Тогда, чтобы сделать так, чтобы инфа была полная и каждого пользователя можно было инициализировать, необходимо запрашивать у API полную инфу по каждому пользователю в клане, то есть для моего примера я бы делал еще 3 запроса (`/api/players/444`, /api/players/1, `/api/players/4`), и только тогда, уже получив полную информацию о каждом пользователе я бы стал их инициализировать.
Но тут же встает вторая проблема: как мне инициализировать поле clan у каждого пользователя, если сам клан еще не инициализирован до конца? Можно ли сделать какую-нибудь ссылку/указатель на неинициализированный клан? (я знаю что в python нет указателей, но может получится что то сделать с ForwardRef из typing?)
Вопросы:
1. Как сделать так, чтобы при инициализации массива users в классе Clans, сначала шел бы запрос к API по этому пользователю, из полученных данных создавался новый объект User со ссылкой на текущий клан (который не инициализирован до конца)?
2. Как это можно реализовать с помощью pydantic? У меня была идея с валидаторами (`@validator`)[https://gist.github.com/bim-ba/22c2327b256942d996afb8b91170639b#file-possible-py], но там бросается исключение ConfigError как раз таки из-за того, что я пытаюсь инициализировать clan не до конца инициализированным кланом (в котором отсутствует массив `users`)?
Короче говоря:
Мне нужно создать объект Clan, который содержит в себе массив пользоваталей, а каждый пользователь в свою очередь ссылается на этот клан (то есть возникает проблема что я не могу инициализировать объекты неполными объектами)
Ты же понимаешь, что циклические структуры ты из апишки не вернёшь?
а можно TL;DR версию?
Форвард реф создаётся автоматом когда ты в кавычках указываешь
разве? мне казалось там его надо еще дополнительно инициализировать?
Наоборот, нельзя
Обсуждают сегодня