Django在同一数据表中的多个字段内搜索查询

时间:2017-10-09 22:57:30

标签: python django python-3.x django-models django-views

这是我的models.py文件。

class CustomerInfo(models.Model):
    customer_name=models.CharField('Customer Name', max_length=50)
    customer_mobile_no = models.CharField('Mobile No', null=True, blank=True,max_length=12)
    customer_price=models.IntegerField('Customer Price')
    customer_product_warrenty = models.CharField('Product Warrenty',null=True, blank=True,max_length=10)
    customer_sell_date = models.DateTimeField('date-published', auto_now=True)
    customer_product_id=models.CharField('Product ID',max_length=150,null=True, blank=True)
    customer_product_name=models.CharField('Product Name', max_length=50)
    customer_product_quantity=models.IntegerField('Quantity',default=1)


    def __str__(self):
        return self.customer_name

现在我想搜索像customer_name, customer_mobile_no,customer_product_id等多个视频。所以我创建了views.py文件

def customerPage(request):
    customers = CustomerInfo.objects.all()

    if request.method =="GET":
       customerid = request.GET['customer_id']

       try:
           customers = CustomerInfo.objects.get(pk=customerid)
           cus_name = CustomerInfo.objects.filter(customer_name__contains=customerid)
           mobile_number = CustomerInfo.objects.filter(customer_mobile_no__contains=customerid)



           return render(request, 'shop/customer.html', {"cus_name": cus_name,"mobile_number": mobile_number, "customers": 'customers', "site_name": "Moon Telecom"})
       except:
           return render(request, 'shop/customer.html', {"error": "Not found any info"})

    return render(request, 'shop/customer.html', {'customers': customers})

这是我的html文件

{% extends "shop/base.html" %}

{% block content_area %}

<div class="col-lg-4">
    <div class="customer_search" >
        <form action="{% url "shop:customerPage" %}" method="GET">
            {% csrf_token %}
            <div class="form-group">
                <label for="customer_id">Id:</label>
                <input type="text" class="form-control" id="customer_id" placeholder="Enter customer ID" name="customer_id">
            </div>
            <button type="submit" class="btn btn-default">Submit</button>
        </form>
    </div>
</div>

<div class="col-lg-8 customers_info">
    {% if error %}
    <div class="alert alert-danger">
        <strong>{{error}}</strong>
    </div>
    {% endif %}



{% if cus_name %}

    {% for x in cus_name  %}
    <p>{{x.customer_name}}</p>
    {% endfor %}
{% else %}
<p>nothing foung</p>
{% endif %}


{% if customers %}
    <table class="table">
        <thead>
            <tr>
                <th>Name</th>
                <th>Mobile No</th>
                <th>Product Name</th>
                <th>Price</th>
                <th>Date</th>
                <th>Product ID</th>
                <th>Warrenty</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td><a href="/shop/{{customers.id}}/customerprofile">{{customers.customer_name}}</a></td>
                <td>{{customers.customer_mobile_no}}</td>
                <td>{{customers.customer_product_name}}</td>
                <td>{{customers.customer_price}} TK</td>
                <td>{{customers.customer_sell_date}}</td>
                <td>{{customers.customer_product_id}}</td>
                <td>{% if customers.customer_product_warrenty == '' %}
                <b>No Warrenty</b>
                {% else %}
                 <b>{{customers.customer_product_warrenty}}</b> Month
                {% endif %}
                </td>

            </tr>
        </tbody>
    </table>
     {% else %}
    <p>nothing found</p>
    {% endif %}


</div>



{% endblock  %}

我得到了结果如果我使用POST方法和customers = CustomerInfo.objects.get(pk=customerid)当我搜索一个字段时,我得到了我的结果但是当我从数据库开始多个搜索查询时。我无法得到任何信息。我想在CustomerInfo模型中搜索多个字段。此外,我正在尝试其他人,但没有工作。

1 个答案:

答案 0 :(得分:3)

您需要在一个查询中使用多个字段进行搜索。在查看代码时,我假设条件是使用OR加入的。

使用django ORM's Q object

可以解决此问题

它允许您做的是将多个过滤条件链接在一起并以逻辑方式连接它们。

因此,如果您有3个条件并且它们在逻辑上连接为: 使用Condition 1 OR Condition 2 AND Condition 3的{​​{1}}您可以将其编写为:

Q | Q(Condition1) &amp; Q(Conditon2)

在您的情况下,可以执行3次不同的过滤搜索:

Q(Condition2)