python - 嵌套对象的迭代访问
问题描述
问题描述
该问题是一个经典的物料清单 (BoM) 问题;假设我们将类BomEntry(object)
定义为:
class BomEntry:
def __init__(self, part, quantity=0, unit="", children=[]):
self.part = part
self.quantity = quantity
self.unit = unit
self.children = children
part
是一个 django 模型,并且quantity
是unit
它的两个成员。
Django 模型有一个方法,它返回(一个不使用 django 的类)的make_bom(self)
实例。是跟踪数据库中 BoM 数据的 django 模型BomEntry
Asm
def make_bom(self, depth=1):
if not self.is_asm:
return BomEntry(self, 1, "", [])
else:
children = list(Asm.objects.filter(parent=self))
children_bom = [BomEntry(obj.child, obj.quantity, obj.unit, []) for obj in children]
bom = BomEntry(self, 1, "", children=children_bom)
return bom
我目前包含一个参数来决定 BoM 的深度,但我无法理解如何使用它。
我希望能够遍历嵌套对象,最终得到与此类似的输出:
{
'part': <PartAsm: 100-1822-R1-A>,
'quantity': 1,
'unit': '',
'children':
[
{
'part': <PartAsm: 100-1823-R1-A>,
'quantity': 1,
'unit': '',
'children':
[]
},
{
'part':
<PartAsm: 100-1824-R1-A>,
'quantity': 1,
'unit': '',
'children':
[
{
'part': <PartAsm: 100-1825-R1-A>,
'quantity': Decimal('1.00'),
'unit': 'g',
'children':
[]
},
{
'part': <PartAsm: 100-1826-R1-A>,
'quantity': Decimal('1.00'),
'unit': 'g',
'children':
[]
}
]
}
]
}
上面的输出是使用控制台获取的,我将不胜感激有关循环或使其递归的任何建议。我希望我提供了足够清晰的信息
解决方案
当depth
大于1
时,应在调用中make_bom()
递归、递减。depth
def make_bom(self, depth=1):
if not self.is_asm:
return BomEntry(self, 1, "", [])
else:
if depth > 1:
children = list(Asm.objects.filter(parent=self))
children_bom = [make_bom(BomEntry(obj.child, obj.quantity, obj.unit, []), depth-1) for obj in children]
else:
children_bom = []
bom = BomEntry(self, 1, "", children=children_bom)
return bom
推荐阅读
- javascript - 排毒测试:跟踪导致测试框架永远等待的 Javascript 计时器
- docker - 无法在 Windows 10 上为 Docker Linux 容器共享 C 盘
- reactjs - 禁用提交按钮 redux 表单
- java - 如何将.class文件更改为文本文件
- regex - 正则表达式仅匹配字符串中的数字
- html - 我的图像没有占据页面的整个宽度
- qt - 极端缩放时巨大的图像撕裂/消失
- android - getitemcount() 在 recyclerview 中使用电影 api 返回 null
- stata - 什么时候在 Stata 中为有效的范围内整数 i 和 j 调用 el(s,i,j) 是非法的?
- angular - 使用 rxjs Angular 和 ngrx 同步处理 Observable 以防止过多的 HTTP 请求超时