首页 > 解决方案 > 使用 django 过滤器搜索所有内容

问题描述

我正在尝试搜索多个字段和全文警告表。我使用 django 过滤器进行搜索,但没有返回结果。我还使用 django 过滤器引用了一些代码并遵循它们,但没有。我该如何解决?这是一些代码。

过滤器.py

import django_filters
from .models import Warnings


class WarningFilter(django_filters.FilterSet):
    title = django_filters.CharFilter(lookup_expr='icontains')
    detail = django_filters.CharFilter(lookup_expr='icontains')
    type = django_filters.CharFilter(lookup_expr='icontains')
    website = django_filters.CharFilter(lookup_expr='icontains')

    class Meta:
        model = Warnings
        fields = ['title', 'detail', 'type', 'website']

视图.py

def search(request):
    if request.method == 'GET':
        query = request.GET.get('q')
        result = WarningFilter(query, queryset=Warnings.objects.all())
    context = {'filters': result.qs}
    return render(request, 'pages/history_warning.html', context)

模型.py

from django.db import models
from django.contrib.auth.models import User
import uuid


class Website(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(max_length=200)
    uri = models.CharField(max_length=200)
    def __str__(self):
        return self.name

class Warnings(models.Model):

    TYPE_WARNINGS = (
        ('security', "Cảnh báo bảo mật"),
        ('service', "Cảnh báo dịch vụ")
    )
    title = models.CharField(blank=True, null=True, max_length=255)
    detail = models.TextField(blank=True, null=True)
    date_created = models.DateTimeField(auto_now_add=True, blank=True, null=True)
    type = models.CharField(choices=TYPE_WARNINGS, blank=True, null=True, max_length=255)
    website = models.ForeignKey(Website, on_delete=models.CASCADE)

    def __str__(self):
        return self.title

标签: djangodjango-filter

解决方案


可能你可以这样做filter.method

class WarningFilter(django_filters.FilterSet):
    q = django_filters.CharFilter(method='filter_q')

    def filter_q(self, qs, name, value):
        return qs.filter(
            Q(title__icontains=value) | Q(detail__icontains=value) | Q(type__icontains=value) | Q(website__name__icontains=value)
        )

用法:

if request.method == 'GET':
    result = WarningFilter(request.GET, queryset=Warnings.objects.all())
    context = {'filters': result.qs}
    return render(request, 'pages/history_warning.html', context)

推荐阅读