Джанго: поиск по ингредиентам - PullRequest
0 голосов
/ 09 декабря 2018

Я создаю сайт, где пользователи могут искать рецепты для ингредиентов, но я могу искать только, набрав 1 ингредиент, когда я набираю более одного, поиск возвращается пустым. Правильный поиск будет для пользователя, чтобы вставить несколько ингредиентов и вернуть рецепты, которые содержат эти ингредиенты. Я не могу найти, что не так: (

Вот мои модели.py

class Fotos(models.Model):
    id = models.AutoField(primary_key=True)
    linkfoto = models.ImageField()
    nomes = models.ForeignKey('Nomes', models.DO_NOTHING, blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'fotos'


class Ingredientes(models.Model):
    id = models.AutoField(primary_key=True)
    ingrediente = models.TextField()
    nomes = models.ForeignKey('Nomes', models.DO_NOTHING, blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'ingredientes'


class Nomes(models.Model):
    id = models.AutoField(primary_key=True)  # AutoField?
    nome = models.TextField()

    class Meta:
        managed = False
        db_table = 'nomes'

views.py

from django.shortcuts import render
from .models import Ingredientes, Nomes, Fotos


def post_list(request):
    termo_busca = request.GET.get('pesquisa')
    if termo_busca:
        a = Ingredientes.objects.all().filter(ingrediente__contains=termo_busca)

        # a = a.exclude(ingrediente__icontains=termo_busca!=termo_busca)
        busca = [p.nomes_id for p in a]
        lista = []
        for i in busca:
            nome = Nomes.objects.get(id=i)
            ingredientes = Ingredientes.objects.filter(nomes_id__in=[i])
            foto = Fotos.objects.get(id=i)
            lista.append([nome, ingredientes, foto])

    else:
        a = Nomes.objects.all()[:10]
        cont = len(a)
        lista = []
        for i in range(1, cont):
            nome = Nomes.objects.get(id=i)
            ingredientes = Ingredientes.objects.filter(nomes_id__in=[i])
            foto = Fotos.objects.get(id=i)
            lista.append([nome, ingredientes, foto])

    return render(request, 'aplicacao/post_list.html', {'lista': lista})

1 Ответ

0 голосов
/ 09 декабря 2018

Прежде всего используйте

ingrediente__icontains

Потому что в вашем случае слова «лимон» и «лимон» не совпадают.Я предполагаю, что пользователь вводит слова для поиска в html input или textarea .Вам нужно ограничить ввод с некоторыми правилами.Примеры пользователей должны разделять ингредиенты, используя пробел.См. Правильную строку поиска.

Соль лимонной рыбы Тогда, на ваш взгляд, вам нужно получить ингредиенты один за другим.См

if termo_busca:
    all_ingred = Ingredientes.objects.all()
    searching_ingred = Ingredientes.objects.none()
    for one_ingredient in termo_busca.split():
        searching_ingred = searching_ingred.union(searching_ingred, all_ingred.filter(ingrediente__icontains=one_ingredient))
    # do some with ingredients that match searching
...