[SOLVED] How do I search 2 tables in – Stack Overflow

Issue

This Content is from Stack Overflow. Question asked by tinnies

I am continuing to learn Django as a newbie…..I would like some direction in relation to 1 search query against two tables that hold the same headers such as customer names.
So table 1 is customer names from 2022 and table 2 is customer names from 2021.

I can create the models / admin and URL and set the project up.

How do I create a query to search both tables at the same time and display the result?

View.py
    def index(request,):

    q = request.GET.get('q')

    if q:
        #this is what is searched against.....ie the columns in our model.py
        vector = SearchVector('name')
        
        #This is the value the user is searching for:
        query = SearchQuery (q)
        
        # customers = customer.objects.filter(name__search=q)
        # customers = customer.objects.annotate(search=vector).filter(search=query)
        customers = customer1.objects.annotate(rank=SearchRank(vector, query)).filter(rank__gte=0.001).order_by('-rank')
        
    else:
        customers = None
    
    
    context = {'customers': customers}
    return render(request, 'index.html', context)



Index.html
<!doctype html>
<html lang="en">

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>GAEN</title>
  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet"
    integrity="sha384-0evHe/X+R7YkIZDRvuzKMRqM+OrBnVFBL6DOitfPri4tjfHxaWutUpFmBp4vmVor" crossorigin="anonymous">
</head>

<body>

  {% include 'navbar.html' %}

  <div class="container">


    
    {% block content %}

    <br><br><br><br>
    <form>
      <div class="mb-3">
        <label for="Search Query" class="form-label ">
          <h3>db Search Query</h3>
        </label>
        <br><br>
        <input type="text" class="form-control" aria-describedby="#" name="q">
        <br><br>
        <button type="submit" class="btn btn-primary ">Submit</button>
        <button type="submit" class="btn btn-danger">Reset</button>
      </div>
    </form>

    {% if customers %}


    <br>
    <h3><mark>Results:</mark> {{ customer | length }}</h3>

    <br><br>
    {% for customer in customers %}

    <table class="table table-striped">
      <thead>
        <tr>
          <th scope="col">Search Result</th>
          <th scope="col">name</th>                  
        </tr>
      </thead>

        <tbody>
          <tr>
            <th scope="row">1</th>
            <td>{{ customer.name }}</td>            
          </tr>
        </tbody>
      </table>

    
      Rank: {{ customer.rank }}
      <br><br><br>

          {% endfor %}
      
      

      {% endif %}
  {% endblock %}

</div>





  <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0-beta1/dist/js/bootstrap.bundle.min.js"
    integrity="sha384-pprn3073KE6tl6bjs2QrFaJGz5/SUsLqktiwsUTF55Jfv3qYSDhgCecCxMW52nD2"
    crossorigin="anonymous"></script>
   



Solution

Django-filter can do it easily!


This Question was asked in StackOverflow by tinnies and Answered by SS_SS It is licensed under the terms of CC BY-SA 2.5. - CC BY-SA 3.0. - CC BY-SA 4.0.

people found this article helpful. What about you?