首页 > 解决方案 > Django 搜索

问题描述

我正在尝试制作用户可以同时查找一个类别的几个名称的应用程序。Fe 有 10 个名字,如 mexicola、red rasputin 和 black magic。我希望用户可以通过编写“mexicola red rasputin”或“red rasputin mexicola black magic”或“black magic”等来查找 mexicola 和 red rasputin。但现在它只适用于一个..我找不到问题所在。

以下是我的看法

from django.shortcuts import render
from django.db.models import Q #new

from .models import Recipe
from .models import Ingredient

def drink_list(request):
    template = "drinks/drink_list.html"
    return render(request, template)


def search_results(besos):

    query = besos.GET.get('q')
    q = Q()
    for queries in query.split():
        q = (Q(recipe_name__icontains=queries))
    results = Recipe.objects.filter(q)

    template = "drinks/search_results.html"
    context = {
        'results' : results,
    }
    return render(besos, template, context)

模型:

from django.db import models


class Ingredient(models.Model):

  ingredient_name = models.CharField(max_length=250)

  def __str__(self):
    return self.ingredient_name


class Recipe(models.Model):

  recipe_name = models.CharField(max_length=250)
  preparation = models.CharField(max_length=1000)
  ingredients = models.ManyToManyField(Ingredient)

  def __str__(self):
    return self.recipe_name

标签: pythondjangosearchdjango-q

解决方案


在构建您的查询集过滤器q时,您会一次又一次地覆盖同一个实例 - 您应该-it 代替:

    for queries in query.split():
        q = q | Q(recipe_name__icontains=queries)

但是,总的来说,如果您的表变大(查询将花费很长时间),这种方法不会很快


推荐阅读