在Django中定义QuerySet的位置

时间:2016-12-23 10:12:25

标签: python django django-queryset

我想定义一个查询集。在shell中它很好,我可以过滤我想要的列:

pat1 = Patient.objects.get(pk=1)
pat1.examinationgeometry_set.filter(examination='FIRST')

现在我想从中定义一个QuerySet,但我不知道在哪里定义它以及如何定义它。在视图,模板,模型中?我该怎么写呢?我知道我必须用函数定义它,但是django有没有任何函数呢?

此查询集背后的想法是从第一次检查中显示我的数据库中的所有结果。所以在我的模板中我有这样的想法:

{% if Patient.examinationgeometry_set.filter(examination='FIRST') %}
 {% for geo in patient.examinationgeometry_set.all %}
   <li> x:  {{ geo.x }}<br/>
        c: {{ geo.c }}  <br/>
        b: {{ geo.b}}<br/>
        n: {{ geo.n}}<br/>
   </li>
 {% endfor %}
{% endif %}

我感谢每一个提示!

1 个答案:

答案 0 :(得分:0)

查询集应该在视图中进行,而不是在模板中,根据您的代码,它应该是这样的:

view.py:

def my_view:
  patients = Patient.objects.all()
  context = {"patients": patients}
  return render(request, "template_path", context)

template.html:

{% for patient in patients %}
  {% for geo in patient.examinationgeometry_set.all %}
    {% if geo.examination == 'FIRST' %}
      <li> 
          x:  {{ geo.x }}<br/>
          c: {{ geo.c }}<br/>
          b: {{ geo.b}}<br/>
          n: {{ geo.n}}<br/>
      </li>
    {% endif %}
  {% endfor %}
{% endfor %}

更好的选择是为您的患者模型创建一个python属性:

class Patient(stuff):
  # your model stuff
  @property
  def first_examinationgeometry_set():
    # maybe this should use .get() instead of filter?
    return self.examinationgeometry_set.filter(examination="FIRST")

现在在模板中调用它(与第一个示例相同的视图):

{% for patient in patients %}
  {% with geo=patient.first_examinationgeometry_set %}
    <li> 
        x:  {{ geo.x }}<br/>
        c: {{ geo.c }}<br/>
        b: {{ geo.b}}<br/>
        n: {{ geo.n}}<br/>
    </li>
  {% endwith %}
{% endfor %}