1

模型.py:

class InjuredLocation(models.Model):
    reportperson = models.ForeignKey(ReportPerson)
    mark1 = models.BooleanField('Mark1', default=False)
    mark2 = models.BooleanField('Mark2', default=False)
    mark3 = models.BooleanField('Mark3', default=False)       

class Report(models.Model):
   user = models.ForeignKey(User, null=False)
   report_number = models.CharField('report Number', max_length=100)

class ReportPerson(models.Model):   
    report = models.ForeignKey(Report)
    action_type = models.CharField(max_length=100, choices=ACTION_TYPE)
    name = models.CharField('Name', max_length=100)

这是我的三个模型,我想从InjuredLocation模型中过滤数据。

  1. Reportperson 表包含该表的报告 id 和名称字段可以是多个。每个报告可以有多个名称。
  2. 我想InjuredLocation通过参考过滤表中的数据reportperson_id
  3. 过滤后的数据应用于等效报告。

试过:

 injury_list = []
    reportperson = ReportPerson.objects.filter(report=report_id, action_type="involved")    
    injuary_mark = InjuredLocation.objects.filter(pk=reportperson)
    for injuary in injuary_mark:
        mark = InjuredLocation.objects.get(pk=injuary.id)
        marklist={'mark':mark}        
        injury_list.append(marklist) 

如果 Reportperson 表有多个名称,我在第 5 行收到此错误“(1242,'子查询返回超过 1 行')”。

更新:

injuery_list = []
injuries = InjuredLocation.objects.filter(reportperson__report=report_id, reportperson__action_type="involved")
for reportperson in injuries:    
    injun = InjuredLocation.objects.get(pk=reportperson.id)
    list_inju = {'person': injun}
    injuery_list.append(list_inju)

能够从 InjuredLocation 模型中获取对象,在模板中我渲染了它,但问题是“它应该根据 reportperson_id 渲染,而不是渲染所有”,例如,如果 InjuredLocation 模型有 reportperson_id=1,mark1=0 & mark2=1 并且对于 reportperson_id =2,mark1=1 & mark2=0 对于reportperson_id,它都呈现这样的“1 1”。预期的输出是0 1 和1 0。所有reportperson_id 的选择都是显示。

模板是

{%for injuary_mark in injuery_list%}
    {%if injuary_mark.person.mark1 %}<img style="float: right; margin:5px 4px -35px 0;" src="{{BASE_URL}}/static/images/red-cross.png"> {% endif %}
    {%if injuary_mark.person.mark2 %}<img style="float: right;margin:5px 8px -35px -8px;" src="{{BASE_URL}}/static/images/red-cross.png"> {% endif %}
{%endfor%}

最后更新:

我想根据 Reportperson 模型中的 id 显示 InjuredLocation 模型中的详细信息。这是来自单个报告,请参见图中的报告模型。

我在下面粘贴了所有三个带有数据的模型。

报告人模型 受伤位置模型 报告模型

我需要的输出是,当 InjuredLocation 模型中的一行针对 Reportperson 表中的 ID 创建时,将动态创建一个选项卡。我想在各自选项卡中显示 InjuredLocation 表中的标记与 Reportperson 表中的各自 ID。现在所有在 Reportperson 模型中针对 id 创建的标记显示在所有选项卡中。假设 id=1 的标记为空,id=2 和 id=3 的标记在数据库中,根据要求 tab1 不应显示任何数据,但现在tab1 显示来自 id=2 和 id=3 的数据的 tab2 和 tab3 的数据。需要帮助

4

1 回答 1

1

您的问题出在这一行:

injuary_mark = InjuredLocation.objects.filter(pk=reportperson)

异常指的是不同的行,因为那是实际评估查询集的地方。

这里有两个问题。

致命的是它reportperson不是一个单一的值——它是一个查询集:

reportperson = ReportPerson.objects.filter(report=report_id, action_type="involved")

正如您所注意到的,“每个报告可以有多个名称” - 这将找到所有与 action_type 匹配的名称,因此在精确查找中使用它不是一个合适的值。

此外,您几乎肯定不是说pk=reportperson- 即使reportperson是单个值,您也在错误的字段上进行过滤。

该修复在某种程度上取决于您想要对多个名称执行的操作。如果您只想获取InjuredLocation与 report_id 相关的所有实例而不考虑报告名称,这是一个更简洁的表达式:

injuries = InjuredLocation.objects.filter(reportperson__report_id=report_id, reportperson__action_type="involved")

如有必要,您可以使用原始reportperson查找,然后使用__in过滤器,但上面__用于过滤相关值的版本更简洁。在数据库中,__in使用子查询,而过滤使用__执行连接;两者可以有不同的表现。__in版本将是:

 reportpeople = ReportPerson.objects.filter(report=report_id, action_type="involved")
 injuries = InjuredLocation.objects.filter(reportperson__in=reportpeople)

如果您想将每个InjuredLocation实例与其ReportPerson实例一起保留,例如因为您要将它们分组到一个模板中:

reportpeople = ReportPerson.objects.filter(report_id=report_id, action_type="involved")
for reportperson in reportpeople:
    injuries = reportperson.injuredlocation_set.all()
    # now do something with them

编辑:

如果您给我一个示例,如何制作查询集以及如何在模板中迭代将对我有很大帮助

就像是:

在视图中:

reportpeople = ReportPerson.objects.filter(report_id=report_id, action_type="involved")
return render('mytemplate.html', {'reportpeople': reportpeople})

在模板中:

{% for reportperson in reportpeople %}
  <p>Report name: {{ reportperson.name }}</p>
  <ul>
    {% for injured_location in reportperson.injuredlocation_set.all %}
      <li>
        {% if injured_location.mark1 %}
          <img style="float: right; margin:5px 4px -35px 0;" src="{{BASE_URL}}/static/images/red-cross.png"> {% endif %}
        {% if injured_location.mark2 %}
          <img style="float: right;margin:5px 8px -35px -8px;" src="{{BASE_URL}}/static/images/red-cross.png"> {% endif %}
      </li>
    {% endfor %}
  </ul>
{% endfor %}

或者您想要的每个报告名称的任何 HTML。关键是您可以通过管理器获取InjuredLocation与特定实例相关的实例。 ReportPersoninjuredlocation_set

于 2013-07-16T20:52:43.377 回答