Django查询功能未正确过滤用户类型

时间:2019-02-17 18:04:54

标签: python django

我正在尝试过滤所有用户,并选择具有user is teacher = Trueuser 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 %}

1 个答案:

答案 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)