我正在尝试过滤所有用户,并选择具有user is teacher = True
和user has instrument1 ='Cello'
的用户。我的功能是显示所有拥有user has instrument1 ='Cello'
的用户,而不仅仅是老师。我想知道如何正确编写我的函数,以便它也可以选择教师。如果用户是老师,他们将以user.teacher=1
或其他user.teacher=0
的身份保存在我的数据库中。
views.py
def teacher_list(request):
data = User.objects.filter(Q(teacher=True) and Q(instrument1='Cello'))
form = TeacherProfileForm()
context = {'form' : form, 'data' : data}
return render(request, 'view/teacher_list.html', context)
HTML
<div class="desktop">
{% for user in data %}
<div class="row">
<div class="col-md-4 left">
<img src="{{ user.avatar.url }}" height="170" width="170">
</div>
<div class="col-md-4 mid">
<h3>{{ user.first_name|capfirst }} {{ user.last_name|capfirst }}</h3>
<h5>{% if user.instrument1 != "" %}{{ user.instrument1|capfirst }}{% endif %}{% if user.instrument2 != ""%}, {{ user.instrument2|capfirst }}{% endif %}{% if user.instrument3 != "" %}, {{user.instrument3|capfirst }}{% endif %}{% if user.instrument4 != "" %}, {{ user.instrument4|capfirst}}{% endif %}{% if user.instrument5 != "" %}, {{ user.instrument5|capfirst }}{% endif %}</h5>
<p>{{ user.bio|capfirst }}</p>
</div>
<div class="col-md-4 right">
<br />
<x-star-rating value="5" number="5" id="rating"></x-star-rating>
<br />
<br />
<br />
<a href="{% url 'view:profile' user.id %}">
<button type="submit" name="submit" class="btn blue_button">Book Lesson</button>
</a>
</div>
</div>
<hr />
{% endfor %}
答案 0 :(得分:2)
简而言之::请勿使用and
运算符组合Q
对象。在Python中,and
运算符将根据第一个操作数的真实性返回其中一个操作数。使用&
,或者像这里一样,可以简化表达式。
背景:请勿使用and
来组合两个Q
对象。 Python中的and
是一个检查第一个操作数的真实性的函数,如果那个是False
,则返回第一个操作数,否则返回第二个操作数。因此,这意味着:
>>> Q(teacher=True) and Q(instrument1='Cello')
<Q: (AND: ('instrument1', 'Cello'))>
而:
>>> Q(teacher=True) & Q(instrument1='Cello')
<Q: (AND: ('teacher', True), ('instrument1', 'Cello'))>
实际上,由于有条件的Q
个对象具有真实性True
,因此Q(teacher=True) and Q(instrument1='Cello')
表达式将重现 second 操作数,因此Q(instrument1='Cello')
< / p>
实际上,您一开始不需要Q
对象,可以像这样查询:
def teacher_list(request):
data = User.objects.filter(teacher=True, instrument1='Cello')
form = TeacherProfileForm()
context = {'form' : form, 'data' : data}
return render(request, 'view/teacher_list.html', context)