Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django查询集将行值作为列名获取_Python_Django_Django Models_Django Views - Fatal编程技术网

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)
我需要一个django
QuerySet
来获取如下数据:

....................................................
: 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
model
r.status
需要是一个列表,每个构建都有多个状态。基本上,我想生成html格式的表,如html所述。我知道我要求的事情太多了,因为我对django和SQL都是新手,请帮助我this@santosh实际上,您需要的是一个矩阵表。稍后我会更新我的答案。