动态选择 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】:

您可以选择使用onlyvalues。你的例子可以正常工作:

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 列的主要内容,如果未能解决你的问题,请参考以下文章

Django ORM 类似于 Pony ORM 中的选择查询

Django ORM:选择相关集

使用 django ORM 进行高级选择

Django ORM查询无法选择新对象

使用 Django ORM 进行选择性事务管理

Django ORM - 具有不同选择子句的分组聚合