2016-12-23 3 views
0

Я хочу определить набор запросов. В оболочке это все хорошо, и я могу фильтровать колонку я хочу с:Где определить QuerySet в Django

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

querysets, как правило, построены в представлении и передается на шаблон – e4c5

+1

Вы не можете использовать фильтр в шаблонах. Вы должны сделать templatetags для данных фильтра из объекта модели. В противном случае отправьте отфильтрованные данные из представления в шаблоны –

+1

вся логика относительно получения данных должна идти в представлениях, по сути, она не будет работать в шаблонах именно по этой причине. –

ответ

0

Querysets должны быть сделаны в представлении, не в шаблоне, учитывая ваш код, он должен быть чем-то вроде этого:

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

Лучшим вариантом является сделать свойство питона для вашей модели пациента, как это:

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