1

This is my models.py file.

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

Now I want to search in muliple fieds like as customer_name, customer_mobile_no,customer_product_id etc. So I created views.py file

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

and this is my html file

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

I got results If I use POST method and customers = CustomerInfo.objects.get(pk=customerid) When I searched one field, I have got my results but When I start multiple search query from the database. I cant get any info. I want to search multiple fields within CustomerInfo model. Also, I was trying others mehtod but not working.

1 Answer 1

3

You need to search using multiple fields in one query. And looking at your code, i presume that the conditions are joined using OR.

This problem can be solved using django ORM's Q object

What it allows you do is to chain multiple filtering conditions together and connect them logically.

So, if you have 3 conditions and they are logically connected as : Condition 1 OR Condition 2 AND Condition 3 using Q you can write them as :

Q(Condition1) | Q(Conditon2) & Q(Condition2).

In your case the 3 different searches of filterings can be performed as:

filtered_customers = CustomerInfo.objects.filter( Q(pk = int(customerid)) | Q(customer_name__contains = str(customerid)) | Q(customer_mobile_no__contains = str(customerid)))
Sign up to request clarification or add additional context in comments.

2 Comments

When I searched with any numbers, all was okay. but i find error, if i searched with strings
That's because pk is an integer and the rest of the fields you are using for filtering are CharField. So, you have to apply appropriate type conversion. Added this to the answer.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.