如何以这种方式过滤数据?

时间:2013-07-16 16:18:10

标签: django django-models django-templates django-views

models.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. 报告人员表包含报告ID,该表的名称字段可以是多个。每个报告可以有多个名称。
  2. 我想参考InjuredLocation
  3. 过滤reportperson_id表格中的数据
  4. 过滤后的数据应该是等效报告。
  5. 尝试:

     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) 
    

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

    更新

    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模型中获取对象,在模板i中渲染它,但问题是“它应该针对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模型中的详细信息。这是来自单个报告,请参见图中的报告模型。

    以下粘贴数据的所有三个模型。

    Reportperson model InjuredLocation model Report model

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

1 个答案:

答案 0 :(得分:1)

你的问题在于这一行:

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

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

这里有两个问题。

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

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

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

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

修复程序在某种程度上取决于您想要对多个名称做什么。如果您只想获取与report_id相关的所有InjuredLocation实例,而不管报告名称如何,这是一个更简洁的表达式:

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经理获取与特定ReportPerson实例相关的injuredlocation_set个实例。