簡體   English   中英

Django搜索多個過濾器

[英]Django search multiple filters

假設我有一個模型

模型.py

class user:
    name = models.CharField(max_length=25)

class job:
    job_name = models.CharField(max_length=25)

class user_job:
    user = models.ForeignKey('user')
    job  = models.ForeignKey('job')

表格.py

 jobs = (
     ('0', 'a'),
     ('1', 'b'),
     ('2', 'c'),
 )

 class searchForm:
     box = forms.ModelMultipleChoiceField(
                                          choices = jobs,
                                          widget  = forms.CheckboxSelectMultiple(),
                                          label   = 'Search',
                                         )

我可以搜索有工作“a”的用戶

user_job.objects.filter(job__exact = 'a') ...

我試圖搜索同時擁有工作'a'和工作'c'的用戶

search_q = user_job.objects.filter(job__exact = 'a')
search_q = search_q.filter(job__exact = 'c')

但是我得到了所有擁有工作“a”工作“c”的用戶,並且我需要所有同時擁有這兩個工作的用戶。

有沒有一種方法可以通過 Django 過濾它,或者我需要過濾一個作業,然后遍歷結果並檢查第二個作業?

您可能會發現從User模型中搜索更容易,因為您需要的是具有這兩個作業的Users列表。 Django會自動在模型上設置屬性,允許您從模型實例和數據庫查詢中訪問相關模型。

假設您設置了這樣的模型:

from django.db import models

class User(models.Model):
    name = models.CharField(max_length=25)

    def __repr__(self):
        return '<User: %s>' % self.name

class Job(models.Model):
    name = models.CharField(max_length=25)

    def __repr__(self):
        return '<Job: %s>' % self.name

class UserJob(models.Model):
    user = models.ForeignKey(User)
    job = models.ForeignKey(Job)

    def __repr__(self):
        return '<UserJob: %s %s>' % (self.user.name, self.job.name)

並按如下方式填充:

u1 = User.objects.create(name='u1')
u2 = User.objects.create(name='u2')
u3 = User.objects.create(name='u3')

a = Job.objects.create(name='a')
b = Job.objects.create(name='b')
c = Job.objects.create(name='c')

UserJob.objects.create(user=u1, job=a)
UserJob.objects.create(user=u2, job=a)
UserJob.objects.create(user=u2, job=b)
UserJob.objects.create(user=u3, job=a)
UserJob.objects.create(user=u3, job=c)

以下查詢將返回用戶3,這是唯一同時具有“作業a”和“作業c”的用戶:

u = User.objects.filter(userjob__job=a).filter(userjob__job=c)

(或者,如果您更喜歡按名稱而不是Job實例引用作業):

u = User.objects.filter(userjob__job__name='a').filter(userjob__job__name='c')

您可以看到Django如何允許您使用雙下划線表示法將User模型中的相關字段遍歷到UserJob模型(關於此的Django文檔位於: httpUserJob / db / queries /#lookups-that-span-relationships

一旦獲得User對象,您可以使用Django添加到模型的關系屬性類似地訪問UserJob實例:

u = User.objects.filter(userjob__job__name='a').filter(userjob__job__name='c')
jobs = u.userjob_set.all()
pip install django-filter

然后在您的安裝應用程序中添加 django-filter:

'django_filters'

然后創建一個新文件,如filter.py

import django_filters
from rent.models import Rent
from django.views import View

class RentFilter(django_filters.FilterSet):
    class Meta:
        model = Rent
        fields = [
            'name', 'bed_room', 'bath_room', 'rent_location', 'types'
        ]

之后在您的views.py中導入RentFilter ,然后按照以下步驟操作:

class BookingFilerListView(View):

def get(self, request):
    booking_list = Booking.objects.all()
    booking_filer = BookingFilter(request.GET, queryset=booking_list)
    template = 'booking/booking_filter.html'
    ctx = {'result': booking_filer}
    return render(request, template, ctx)

最后,在您的booking_filter.html模板中看起來像這樣:

              <form method="get">
                <div class="card-body">
                    <div class="form-group">
                        <label for="phone_number">Phone Number</label>
                        <input type="text" class="form-control" placeholder="Phone Number" name="phone_number">
                    </div>
                    <div class="form-group">
                        <label for="transaction_id">Transaction ID</label>
                        <input type="text" class="form-control" placeholder="Transaction ID" name="transaction_id">
                    </div>
                    <div class="form-group">
                        <label for="booking_date">Booking Date</label>
                        <input type="date" class="form-control" placeholder="Booking Date" name="booking_date">
                    </div>
                    <div class="form-group">
                        <label for="status">Booking Date</label>
                        <select class="form-control" name="status" id="status">
                            <option value="0">PENDING</option>
                            <option value="1">CANCEL</option>
                            <option value="2">PROGRESS</option>
                            <option value="3">DONE</option>
                        </select>
                    </div>
                </div>
                <div class="card-footer">
                    <button type="submit" class="btn btn-success">Filter Booking</button>
                    <button type="reset" class="btn btn-danger">Reset</button>
                </div>
            </form>

在模板底部打印輸出:

                      <table class="table table-striped table-hover">
                        <thead>
                        <tr>
                            <th>Phone Number</th>
                            <th>Transaction ID</th>
                            <th>Booking Date</th>
                        </tr>
                        </thead>
                        <tbody>
                        {% if result %}
                            {% for obj in result.qs %}
                                <tr>
                                    <td>{{ obj.phone_number }}</td>
                                    <td>{{ obj.transaction_id }}</td>
                                    <td>{{ obj.booking_date }}</td>
                                </tr>
                            {% endfor %}
                            {% else %}
                        {% endif %}
                        </tbody>
                      </table>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM