Python中能否在字典定义内循环数组以实现Firebase图片数据上传?
问题核心原因
你当前的代码存在两个逻辑错误:
- 遍历单条文档的
i循环和遍历gallery的j循环平级,导致所有gallery数据只会绑定到最后一次循环生成的doc_ref,只有最后一条文档能写入gallery信息 - 遍历单张图片时重复覆盖
data['gallery']的值,每次赋值的ArrayUnion仅包含单张图片,最终只会保留当前gallery组的最后一张图片记录
正确实现方案
由于len(excel.gallery)和len(excel.name)完全对齐,下标i对应的excel.gallery[i]就是当前文档的所有图片列表,直接在单条文档的构造逻辑内处理gallery即可。
你是首次创建文档,不需要使用ArrayUnion(该方法仅用于已有文档的数组追加更新场景),直接构造gallery数组传入即可:
def image_upload(): for i in range(len(excel.name)): doc_ref = db.collection('plans').document('doc-name').collection('collection-name').document() doc_id = doc_ref.id # 构造当前文档的gallery数组 gallery_list = [] for img in excel.gallery[i]: gallery_list.append({ 'name': img[0], 'type': img[1], 'url': img[2] }) data = { 'bedroomLocation': excel.bedroomLocation[i], 'bedrooms': excel.bedrooms[i], 'brand': excel.brand[i], 'catalog': excel.catalog[i], 'category': excel.category[i], 'code': excel.code[i], 'depth': excel.depth[i], 'description': excel.description[i], 'fullBaths': excel.fullBaths[i], 'garage': excel.garage[i], 'garageBays': excel.garageBays[i], 'garageLocation': excel.garageLocation[i], 'garageType': excel.garageType[i], 'date': firestore.SERVER_TIMESTAMP, 'id': doc_id, 'halfBaths': excel.halfBaths[i], 'laundryLocation': excel.laundryLocation[i], 'name': excel.name[i], 'onCreated': excel.onCreated[i], 'productType': excel.productType[i], 'region': excel.region[i], 'sqf': excel.sqf[i], 'state': excel.state[i], 'stories': excel.stories[i], 'tags': [excel.tags[i]], 'width': excel.width[i], 'gallery': gallery_list } doc_ref.set(data)
如需使用ArrayUnion的场景说明
如果你确实需要用ArrayUnion做数组追加(比如后续给已有文档补充图片),需要把所有要追加的图片一次性传入ArrayUnion参数,不要循环赋值:
# 仅适用于已有文档追加gallery的场景 for i in range(len(excel.name)): doc_ref = db.collection('plans').document('doc-name').collection('collection-name').document() doc_id = doc_ref.id data = { # 其他字段和上文一致,此处省略 } # 批量构造要追加的图片列表 img_items = [] for img in excel.gallery[i]: img_items.append({ 'name': img[0], 'type': img[1], 'url': img[2] }) if img_items: data['gallery'] = firestore.ArrayUnion(img_items) doc_ref.set(data)
内容的提问来源于stack exchange,提问作者Freder
相关产品推荐
相关产品推荐

