动态选择 django orm 列
Posted
技术标签:
【中文标题】动态选择 django orm 列【英文标题】:select django orm columns dynamically 【发布时间】:2017-02-07 10:30:22 【问题描述】:我有一个包含 10 个字段/列的报告表。我想允许用户动态选择他想要在报告中的哪些列。这可以在 Django ORM 中完成吗
例子
如果用户想要 column1 和 column2 那么它应该是这样的
obj = ReportTable.objects.values('column1', 'column2')
如果用户想要 column5、column6、column9、column10 那么它应该是这样的
obj = ReportTable.objects.values('column5', 'column6', 'column9', 'column10')
这在 django orm 中是否可行,或者我应该使用游标或原始查询
【问题讨论】:
您上面的方法应该可以正常工作,只需以某种方式从用户那里获取列列表。您也可以只使用 ReportTable.objects.all() 然后使用 getattr 来获取所需的值。 【参考方案1】:您可以选择使用only
和values
。你的例子可以正常工作:
ReportTable.objects.values('column5', 'column6', 'column9', 'column10')
或者:
ReportTable.objects.only('column5', 'column6', 'column9', 'column10')
如果您正在寻找与SELECT column5, column6, column9, column10 FROM
等效的内容,我建议您使用objects.only
。
【讨论】:
感谢您的快速回答。问题是列的选择是动态的。所以他可以选择任何组合,而我不能有那么多的“如果”陈述。如果您看到我发布的答案,它会采用由用户输入形成的值列表。 @PrabhakarShanmugam 它需要字符串,因此有很多方法可以从前到后传递用户选择。很高兴你找到了你喜欢的方法。【参考方案2】:我找到了这个问题的解决方案。 Django orm 值采用位置参数。
args = ['column5', 'column6', 'column9', 'column10']
obj = ReportTable.objects.values(*tuple(args))
现在可以使用常规的 get 或 post 方法从用户那里获取 args。
【讨论】:
【参考方案3】:您可以在查询集中传递变量而不是硬编码字符串。对于用户选择,用户可以填写表格。
choices = request.POST.getlist('choices')
obj = ReportTable.objects.values(*choices)
obj 将是您的预期输出
并且在模板中可以使用同名的多个输入字段。
<input name="choices">
<input name="choices">
<input name="choices">
【讨论】:
以上是关于动态选择 django orm 列的主要内容,如果未能解决你的问题,请参考以下文章