如何在Django Queryset中获取列名列表?

3

我有一段代码,从不同的表中创建多个复杂的查询集,使用了很多注释等...

然后,该代码使用union连接这些查询集。

每个查询集本身似乎都没问题。对于每个查询集,调用print(len(qset))都有效。

但是,在combined_qset = qset1.union(qset2)之后,我会得到以下错误:

django.db.utils.ProgrammingError: each UNION query must have the
same number of columns
LINE 1: ..., '') AS "owner" FROM "t1") UNION (SELECT "field_x...
                                                     ^

当我查看代码时,我会数一下.only(...).values(...)调用中的字段数量、注释数量等等,似乎所有这些查询集都有完全相同的列数。
错误消息只显示了生成的SQL的一个小部分(请参见上文),因此并没有真正提供帮助。
是否有简单的方法可以获取查询集的列列表,以便我可以找到差异并加以修复?

没有看到你的代码,很难做出任何判断。如果你能分享一下代码,那就容易多了。 - Higor Rossato
代码很长,包含许多表格。代码的重要部分是combined_qset = qset1.union(qset2),这导致了“每个UNION查询必须具有相同数量的列”的错误。 - Granny Aching
1个回答

5

我明白了!

print('qset1:', len(qset1), qset1[0].__dict__.keys())
print('qset2:', len(qset2), qset2[0].__dict__.keys())
print('qset3:', len(qset2), qset3[0].__dict__.keys())
...

qset[0] 返回查询集 qset 的第一行,需要注意的是,这仅在查询集中至少有一行时才有效。

.__dict__ 将该行转换为字典 - 字典的键是列名,值是行元素。

.keys() 给出字典的键列表,因此是列名。

这将打印出所有查询集的列列表。


需要注意的是,.__dict__ 还包含 QuerySet 的其他类属性,例如 _state - Stefan_EOX

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接