2017-10-09 4 views
0

Ceci est mon fichier models.py.Django Requête de recherche dans plusieurs champs du même tableau de données

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 

Maintenant, je veux chercher dans fieds Muliple comme en customer_name, customer_mobile_no,customer_product_id etc. Je créé le fichier 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}) 

et ceci est mon fichier 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 %} 

J'ai obtenu des résultats Si j'utilise la méthode POST et customers = CustomerInfo.objects.get(pk=customerid) Lorsque j'ai cherché un champ, j'ai obtenu mes résultats, mais lorsque je lance plusieurs requêtes de recherche à partir de la base de données. Je ne peux pas obtenir d'informations. Je veux rechercher plusieurs champs dans le modèle CustomerInfo. Aussi, j'essayais d'autres mehtod mais ne fonctionnait pas.

Répondre

1

Vous devez effectuer une recherche en utilisant plusieurs champs dans une requête. Et en regardant votre code, je présume que les conditions sont jointes en utilisant OR.

Ce problème peut être résolu en utilisant django ORM's Q object

Qu'est-ce qu'il vous permet de faire est la chaîne de multiples conditions de filtrage ensemble et les relier logiquement.

Donc, si vous avez 3 conditions et ils sont logiquement connecté en tant que: Condition 1 OR Condition 2 AND Condition 3 utilisant Q vous pouvez les écrire comme:

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

Dans votre cas, les 3 différentes recherches de filtrages peuvent être effectuées que:

filtered_customers = CustomerInfo.objects.filter(Q(pk = int(customerid)) | Q(customer_name__contains = str(customerid)) | Q(customer_mobile_no__contains = str(customerid))) 
+0

Lorsque je cherchais avec des chiffres, tout était correct. mais je trouve l'erreur, si j'ai cherché avec des chaînes –

+0

C'est parce que 'pk' est un entier et le reste des champs que vous utilisez pour le filtrage sont' CharField'. Donc, vous devez appliquer une conversion de type appropriée. Ajouté ceci à la réponse. –