簡體   English   中英

嘗試使用 ArrayUnion 時,Fire 給出“TypeError: Expected a message object, but got field_path”錯誤

[英]Fire gives the "TypeError: Expected a message object, but got field_path" error when trying to use ArrayUnion

我正在嘗試將 firebase 與 python 一起使用。 我已連接到數據庫並在以下方案中:

import firebase_admin
from firebase_admin import credentials, db, firestore

# Initialize connection to firebase
cred = credentials.Certificate("serviceAccountKey.json")
app_options = {
    'databaseURL': '...'}
firebase_admin.initialize_app(cred)
db = firestore.client()

目前數據庫有兩種類型的文檔,當我們將它們轉換為字典時,我們得到以下內容:

Admin: {'users': [], 'email': '...', 'first_name': '...', 'last_name': '...'}
User: {'email': '...', 'onboarding_form': 'first_name': '...', 'last_name': '...'}

我想將用戶的引用添加到作為管理員字段的用戶數組中。 為此,我有以下代碼:

    user_id = get_user_id(user_last_name, user_first_name)
    admin_id = get_admin_id(admin_last_name, admin_first_name)

    user_ref = db.collection(u'user').document(user_id)
    admin_ref = db.collection(u'admin').document(admin_id)

    admin_ref.update(
        {u'users': firestore.ArrayUnion([user_ref])})

但是代碼不會插入對用戶數組的引用。 我收到以下錯誤:

Traceback (most recent call last):
  File "/home/primrose/work/BE/db_api.py", line 109, in <module>
    test_run()
  File "/home/primrose/work/BE/db_api.py", line 106, in test_run
    add_user("...", "...", "...", "...")
  File "/home/primrose/work/BE/db_api.py", line 98, in add_user
    admin_ref.update(
  File "/home/primrose/.local/lib/python3.10/site-packages/google/cloud/firestore_v1/document.py", line 324, in update
    batch, kwargs = self._prep_update(field_updates, option, retry, timeout)
  File "/home/primrose/.local/lib/python3.10/site-packages/google/cloud/firestore_v1/base_document.py", line 239, in _prep_update
    batch.update(self, field_updates, option=option)
  File "/home/primrose/.local/lib/python3.10/site-packages/google/cloud/firestore_v1/base_batch.py", line 141, in update
    write_pbs = _helpers.pbs_for_update(
  File "/home/primrose/.local/lib/python3.10/site-packages/google/cloud/firestore_v1/_helpers.py", line 941, in pbs_for_update
    update_pb.update_transforms.extend(field_transform_pbs)
TypeError: Expected a message object, but got field_path: "users"
append_missing_elements {
  values {
    reference_value: ".../databases/(default)/documents/user/hlCcG1oFW4Z75JKqp1ZcfM8xWlh1"
  }
}
.

我不得不省略reference_value 的名稱和開頭,因此它們是“...”。 我不明白錯誤,什么可能導致錯誤? 提供字段路徑不應該是正確的嗎?

當我嘗試獲取管理員信息時,我得到以下信息:

    print(admin_ref.get().id, " => ", admin_ref.get().to_dict())
    {'users': [], 'email': '...', 'first_name': '...', 'last_name': '...'}

使用的 firebase_admin 和 protovuf 版本是:

Name: firebase-admin
Version: 5.2.0

Name: protobuf
Version: 4.21.2

user_ref(編輯前的前 physio_ref,該名稱不應該出現在問題中)。 我要添加到名為“users”的數組中的數據是對另一個用戶的引用。

使用最新版本的protobuf的 Google Cloud Firestore 存在已知問題。 正如@Cherry Toska 所證實的,將protobuf降級到3.20.1可以解決問題。

pip3 install protobuf==3.20.1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM