Я новичок в использовании Google Drive API для Python (v3), и я пытался получить доступ и обновить подпапки в определенной родительской папке, для которой у меня есть fileId. Вот моя сборка для драйвера API:
store = file.Storage('token.json')
creds = store.get()
if not creds or creds.invalid:
flow = client.flow_from_clientsecrets('credentials.json',
scope='https://www.googleapis.com/auth/drive')
creds = tools.run_flow(flow, store)
service = build('drive', 'v3', http=creds.authorize(Http()))
Я могу успешно получить доступ к самый подпапок с помощью files().list()
, но по крайней мере один отсутствовал в списке возвращенных результатов:
results = service.files().list(
q = "parents in '1QXPl6z04GsYAO0GKHBk2oBjEweaAbczw'",
fields = "files(id, name), incompleteSearch, nextPageToken").execute()
items = results['files']
Я дважды проверил, и в результатах не было ключа nextPageToken
, а значение incompleteSearch
было False
, что, как я предполагаю, означает, что был возвращен полный список результатов. Вдобавок, когда я получил доступ к списку родителей для отсутствующего файла с помощью метода file().get()
, единственным указанным родителем был тот, который указан в запросе выше:
service.files().get(
fileId='1WHP02DtXfJHfkdr47xSeeRIj0sCrihPA',
fields='parents, name').execute()
и возвращает это:
{'name': 'Sara Gaul -Baltimore Corps docs and schedules',
'parents': ['1QXPl6z04GsYAO0GKHBk2oBjEweaAbczw']}
Другие детали, которые могут иметь отношение:
ОБНОВЛЕНИЯ
files().list()
использовался для возврата 40 записей из 41 в папке. Сейчас возвращается только 39.files().get()
, обе невозвращенные папки по-прежнему имеют родительскую папку в качестве единственной родительской, и их разрешения не изменились.Основные вопросы:
file().list()
, не отображается в результатах этого запроса? И есть ли способ настроить запрос или файл, чтобы убедиться, что это так?children()
для папок, но, насколько мне известно, в версии 3 он устарел.Я запустил results.keys()
, и единственный возвращенный ключ был 'files
и, согласно этой документации: developers.google.com/drive/api/v3/reference/files/list, этот ключ отсутствует в возвращаемом объекте, если нет нескольких страниц.
@DaImTo Я только что обновил исходный пост, чтобы включить дополнительную информацию о nextPageToken
и incompleteSearch
fields = 'parent, name' - это запрос частичного ответа, который вы не включили туда, потому что вы никогда его не увидите. попробуйте fields = '*'
@DaImTo Проблема не в методе files().get()
, а в files().list()
, и я включил nextPageToken в список полей, и он по-прежнему недоступен в результатах этого запроса.
Думаю, вам нужно показать мне пример. У меня есть x файлов в этой папке, и только y возвращается. есть ли проблема с правами доступа к отсутствующим файлам?
Кому принадлежит пропавшая папка? Попробуйте установить pageSize = 1 в своем запросе, чтобы несколько страниц с nextPageTokens проверяли логику вашей программы.
@DaImTo Пример указан в исходном посте. В родительской папке с идентификатором 1QXPl6z04GsYAO0GKHBk2oBjEweaAbczw
находится 41 файл, и теперь только 39 не возвращаются в запросе files().list()
, когда я фильтрую файлы, у которых есть родительские файлы с этим идентификатором.
@pinoyyid, проблема не в нескольких страницах, потому что вчера files().list()
вернул 40 записей, сегодня - только 39, а запись, которая больше не отображается в списке сегодня, также была переименована соавтором. Я добавлю этот новый паттерн в исходный пост
Я выяснил ошибку своим кодом:
Мой предыдущий параметр запроса в методе files().list()
был:
results = service.files().list(
q = "parents in '1QXPl6z04GsYAO0GKHBk2oBjEweaAbczw'",
fields = "files(id, name), incompleteSearch, nextPageToken").execute()
items = results['files']
Посмотрев на другую ошибку, которую кто-то опубликовал в системе отслеживания проблем Google для API, я увидел, что предпочтительный синтаксис для этого запроса был:
results = service.files().list(
q = "'1QXPl6z04GsYAO0GKHBk2oBjEweaAbczw' in parents",
fields = "files(id, name), incompleteSearch, nextPageToken").execute()
items = results['files']
Другими словами, переключение порядка parents in fileId
на fileId in parents
. В результате изменения синтаксиса был возвращен 41 файл.
У меня есть два дополнительных вопроса, которые, надеюсь, кто-нибудь сможет прояснить:
parents in ...
? Или их нужно оценивать как отдельные состояния, например, fileId1 in parents or fileId2 in parents
?Если бы кто-то мог прокомментировать этот ответ с этими объяснениями или опубликовать более полный ответ, я бы с удовольствием выбрал его как лучший ответ.
чтобы ответить на ваш первый вопрос, возможно, стоит ПОЛУЧИТЬ файл и просмотреть его родительскую коллекцию. Предполагается, что ваш первоначальный синтаксис каким-то образом соответствовал только первому элементу родителей. На 2, как вы теперь знаете, это «идентификатор в родительских элементах», поэтому вам просто нужно связать предложения вместе с or
.
@pinoyyid Спасибо! Я проверил родителей папки до и после изменения имени, похоже, что способ хранения списка родителей не изменился, но, по крайней мере, я знаю, как раньше избегать этой проблемы. И вот что, это имеет смысл, но, похоже, не позволяет легко параметризовать запросы.
Как вы дважды проверяли, нет ли nextpagetoken, когда вы исключаете его из своих полей?