models.py(派生自现有数据库)
class IceCreamComponent(models.Model):
name = models.CharField
#can be 'flavor', 'nut', etc
class IceCream(models.Model):
name = models.CharField
component = models.ForeignKey(IceCreamComponent)
value = models.CharField #will correspond to the component
此数据库背后的背景是“IceCream”报告将来自某人,其唯一目的是报告某个组件(即我的'临时'记者将报告冰淇淋的名称及其包含的额外内容)。假设查询时所有需要的报告都在数据库中,因此类似于:
IceCreams = IceCream.objects.values('name', 'component__name', 'value')
将返回类似于:
的内容[
{'name': 'Rocky road', 'component__name': 'ice cream flavor', 'value':'chocolate'},
{'name': 'Rocky road', 'component__name': 'nut', 'value':'almond'},
{'name': 'Rocky road', 'component__name': 'extra', 'value':'marshmallow'},
{'name': 'Vanilla Bean', 'component__name': 'ice cream flavor', 'value':'vanilla'},
{'name': 'Vanilla Bean', 'component__name': 'extra', 'value':'ground vanilla bean'},
]
然而,正如你可以想象的那样:
[
{'name': 'Rocky Road', 'ice cream flavor': 'chocolate', 'nut': 'almond', 'extra':'marshmallow' },
{'name': 'Vanilla Bean', 'ice cream flavor': 'vanilla', 'extra':'ground vanilla bean'}
]
更加实用(特别是考虑到我想在ListView中使用它)。
有没有更好的方法来查询数据,还是需要循环使用ValuesQuerySet来实现所需的输出?
答案 0 :(得分:0)
您无法从原始结果中重建列表吗?
results = []
for row in vqueryset:
converted_row = {}
converted_row[row['component__name']] = row['value']
converted_row['name'] = row['name']
results.append(converted_row)
当然,您需要在评估之前对原始结果进行分页(将其转换为列表)。
哦,你问是否有更好的方法。我这样做是因为无论如何我找不到更好的方法。答案 1 :(得分:0)
这是我提出的解决方案。
processing = None
output = []
base_dict = {}
for item in IceCreams:
# Detect change current site code from ordered list
if item['name'] != processing:
processing = item['name']
# If base_dict is not empty add it to our output (only first one)
# TODO see if there's a better way to do first one
if base_dict:
output.append(base_dict)
base_dict = {}
base_dict['name'] = item['name']
base_dict[item['component__name']] = item['value']