2017-02-07 56 views
1

我有一个包含10个字段/列的报表。我想让用户在报告中动态选择他想要的列。可这在Django ORM进行动态选择django orm列

如果用户想列1和列2那么就应该是这样的

obj = ReportTable.objects.values('column1', 'column2') 

如果用户想column5,column6,column9,column10那么就应该是这样的这

obj = ReportTable.objects.values('column5', 'column6', 'column9', 'column10') 

这是可行的在Django ORM或者我应该使用游标或原始查询

+0

以上你的方法应该做工精细,只是从用户获取列的列表莫名其妙。您也可以使用ReportTable.objects.all(),然后使用getattr获取所需的值。 – Johan

回答

0

您可以选择使用onlyvalues。你的榜样将正常工作:

ReportTable.objects.values('column5', 'column6', 'column9', 'column10') 

或者:

ReportTable.objects.only('column5', 'column6', 'column9', 'column10') 

我建议使用objects.only如果你正在寻找的东西相当于SELECT column5, column6, column9, column10 FROM

+0

感谢您的快速回答。事情是选择列是动态的。所以他可以选择任何组合,我不能有那么多'if'陈述。如果您看到我发布的答案,它将获取由用户输入形成的值列表。 –

+0

@PrabhakarShanmugam需要字符串,所以有很多方法可以将用户选择从前向后传递。很高兴你找到了你喜欢的方法。 –

0

我找到了这个问题的解决方案。 Django orm值需要位置参数。

args = ['column5', 'column6', 'column9', 'column10'] 
obj = ReportTable.objects.values(*tuple(args)) 

现在可以使用常规的get或post方法从用户获取参数。

0

您可以传递queryset中的变量而不是硬编码的字符串。并且对于用户选择,表格可以由用户填写。

choices = request.POST.getlist('choices') 
obj = ReportTable.objects.values(*choices) 

OBJ将是你的预期输出

,并在模板多输入字段可以是有相同的名称使用。

<input name="choices"> 
 
<input name="choices"> 
 
<input name="choices">