Python Django查询集将行值作为列名获取
这些是我的模型:Python Django查询集将行值作为列名获取,python,django,django-models,django-views,Python,Django,Django Models,Django Views,这些是我的模型: class Build(models.Model): name = models.CharField(db_index=True, max_length=56) description = models.TextField(max_length=512, null=True, blank=True) class Case(models.Model): name = models.CharField(db_index=True, max_length=
class Build(models.Model):
name = models.CharField(db_index=True, max_length=56)
description = models.TextField(max_length=512, null=True, blank=True)
class Case(models.Model):
name = models.CharField(db_index=True, max_length=255)
description = models.TextField(max_length=1024, null=True, blank=True)
class Result(models.Model):
status = models.CharField(max_length=12)
result_build = models.ForeignKey(Build, related_name='result_build', on_delete=models.CASCADE)
result_case = models.ForeignKey(Case, related_name='result_case', on_delete=models.CASCADE)
我需要一个djangoQuerySet
来获取如下数据:
....................................................
: case_name : case_description : build_X : build_Y :
:...........:..................:.........:.........:
: test1 : case1 : PASS : FAIL :
: test2 : case2 : FAIL : PASS :
:...........:..................:.........:.........:
其中case\u name
和case\u description
是case
模型中的字段
build_X和build_Y是build
model中可用的两个构建名称
通过和失败是不同情况下的状态,并根据
结果
模型构建。这是贯穿模型的多对多关系的经典情况。模型类可以重构如下:
class Build(models.Model):
name = models.CharField(db_index=True, max_length=56)
description = models.TextField(max_length=512, null=True, blank=True)
class Case(models.Model):
name = models.CharField(db_index=True, max_length=255)
description = models.TextField(max_length=1024, null=True, blank=True)
builds = models.ManyToManyField('Build', through='Result', related_name='cases')
class Result(models.Model):
status = models.CharField(max_length=12)
build = models.ForeignKey('Build', on_delete=models.CASCADE)
case = models.ForeignKey('Case', on_delete=models.CASCADE)
我们还可以简单地调用Result
的属性build
和case
,而不需要名称中的冗余。虽然相关的\u name
并不麻烦,但我们在这里并不真正需要它
现在,您可以使用m2m关系查询您的模型:
case = Case.objects.get(pk=1) # get Case object with primary key 1
case.builds.all() # get all Build objects related to case
build = Build.objects.get(pk=1) # get Build object with primary key 1
build.cases.all() # get all Case objects related to build
# UPDATE
# get Result objects for the "case" with pk=1 retrieved before
results = Result.objects.filter(case=case)
# output each entry as row with all property values
for r in results:
print(r.case.name, r.case.description, r.build.name, r.build, description, r.status)
您还可以使用.filter
缩小查询结果的范围
编辑:
下面是创建矩阵表的一种可能方法。这是一个可以放在视图中的代码:
cases = Case.objects.all()
builds = Build.objects.all()
matrix = []
for c in cases:
result = {}
result['case'] = c
result['status'] = []
for b in builds:
result['status'].append(Result.objects.filter(
case=c,
build=b
).values_list('status', flat=True))
matrix.append(result)
现在你应该有一张桌子,每个箱子都有一本字典。将构建
和矩阵
作为上下文传递给模板。然后,您可以迭代构建
来创建表头(注意在开始时为列出案例留出一列或两列的空间)。然后迭代矩阵
,创建表体。首先获取第一列(或前两列)的案例
,然后输出状态
我希望这能为你指路。一旦得到正确的结果,就可以进一步优化性能
编辑2:
下面是一个表格的外观示例。将上述代码片段中的
构建
和矩阵
作为上下文传递到模板:
<table>
<tr>
<th>Case name</th>
<th>Case description</th>
{% for b in builds %}
<th>{{ b.name }}</th>
{% endfor %}
</tr>
{% for row in matrix %}
<tr>
<td>{{ row.case.name }}</td>
<td>{{ row.case.description }}</td>
{% for s in row.status %}
<td>{{ s.0 }}</td>
{% endfor %}
</tr>
{% endfor %}
</table>
案例名称
案例描述
{版本%%中的b的%1}
{{b.name}
{%endfor%}
{矩阵%中的行为%1}
{{row.case.name}
{{row.case.description}}
{s行中的%s.status%}
{{s.0}}
{%endfor%}
{%endfor%}
在第一个for
循环中,我们创建了一个表头,其中两个列头用于案例名称和案例描述,一个列头用于每个构建。在第二个
for
循环中,我们为每个案例创建一个表行。在嵌套循环中,我们输出状态
这是一个非常简单的方法,可能可以进一步优化,但我将此留给您。通过
结果
,在构建
和案例
之间有一个隐式的多对多关系。你有什么理由不想或者不能显式声明这个关系吗?你能用上面的例子详细说明一下显式声明这个关系吗?这将有助于我更好地理解这里主要是我想把value作为列名实际上我需要Result
model中的值,而不是Case
model中的值,因为状态在Result
中可用,所以在查询结果时,同样需要build\u name
作为列名table@santosh您也将从结果模型中获得值。请检查更新。关于您对列名的需求,我认为您混合了Django QuerySet和SQL query的概念。您想在哪里显示该表?HTML页面?或者别的什么?我想在HTML表格中显示一些东西,我的需求看起来仍然很复杂,我需要得到所有的案例,比如case=case.objects.all()
,还需要得到build=build.objects.all()
,最重要的是。在这种情况下,case
可以有多个状态,而查询Result
modelr.status
需要是一个列表,每个构建都有多个状态。基本上,我想生成html格式的表,如html所述。我知道我要求的事情太多了,因为我对django和SQL都是新手,请帮助我this@santosh实际上,您需要的是一个矩阵表。稍后我会更新我的答案。