2016-12-23 44 views
0

我想定义一个queryset。在外壳它是所有罚款,我可以过滤我想用柱:在Django中定义QuerySet的位置

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 %}

我感谢每一个提示!

+2

查询集一般都建在视图中,并传递到 – e4c5

+1

不能在模板中使用过滤器的模板。您必须为模型对象的过滤器数据制作模板标签。否则,将过滤后的数据从视图发送到模板 –

+1

所有与获取数据有关的逻辑都应该放在视图中,事实上,由于这个原因,它不适用于模板。 –

回答

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 %} 
+0

如果您对可维护性和性能有任何顾虑,“另一种选择”当然是正确的选择。 –

+0

@brunodesthuilliers我同意,所以我编辑我的答案反映。 –

+0

非常感谢!它的工作原理,我已经了解如何在Django中制作查询​​/过滤器。 – Boerne