Django ORM调用获取多个fk值?

时间:2015-02-12 01:19:14

标签: django orm

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来实现所需的输出?

2 个答案:

答案 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']