Search code examples
pythondjango-modelsdjango-viewsdjango-queryset

Django error Related Field got invalid lookup: icontains


I am doing a search in Django using a foreign key but it shows this error "Related Field got invalid lookup: icontains." I found similar cases here but it didn't work; I think the error is in the views.py in the queryset_list line.

models.py

class Anos_dos_manuais(models.Model):
    ano = models.CharField(max_length=200)
    publicado = models.BooleanField(default=True)

class Meta:
    verbose_name = 'Ano do manual'
    verbose_name_plural = 'Anos dos manuais'

def __str__(self):
    return self.ano

class Disciplina(models.Model):
    título = models.CharField(max_length=200)
    publicado = models.BooleanField(default=True)

class Meta:
    verbose_name = 'Disciplina'
    verbose_name_plural = 'Disciplinas'

def __str__(self):
    return self.título

class Manuais(models.Model):
    nome = models.CharField(max_length=200, null=True)
    título = models.ForeignKey(Disciplina, on_delete=models.DO_NOTHING)
    descrição = RichTextUploadingField(blank=False)
    ano = models.ForeignKey(Anos_dos_manuais, on_delete=models.DO_NOTHING ,max_length=20, null=True, blank=True)
    imagem = models.ImageField(upload_to='imagens/%Y/%m/%d/')
    manual_pdf = models.FileField(upload_to="manuais/%Y/%m/%d", null=True, blank=False)
    data_publicada = models.DateTimeField(default=datetime.now, blank=False, null=True)
    publicado = models.BooleanField(default=True)

class Meta:
    verbose_name = 'Manual'
    verbose_name_plural = 'Manuais'

def __str__(self):
    return self.nome

When doing the search with the foreign key and icontains it doesn't work, but with other fields it works.

views.py

def search_manual(request):
    queryset_list = Manuais.objects.order_by('-data_publicada')
    disciplinas = Disciplina.objects.filter(publicado=True)
    anos = Anos_dos_manuais.objects.filter(publicado=True)

#keywords
if 'keywords' in request.GET:
    keywords = request.GET['keywords']
    if keywords:
        queryset_list = queryset_list.filter(título__icontains=keywords)

#Ano
if 'manual_ano' in request.GET:
    manual_ano = request.GET['manual_ano']
    if manual_ano:
        queryset_list = queryset_list.filter(ano__icontains=manual_ano)

#Disciplina
if 'manual_disciplina' in request.GET:
    manual_disciplina = request.GET['manual_disciplina']
    if manual_disciplina:
        queryset_list = queryset_list.filter(título__icontains=manual_disciplina)

 
context = {
    'anos': anos,
    'disciplinas': disciplinas,
    'manuais': queryset_list
}
return render(request, 'manuais/search.html', context)




    

Solution

  • Here titulo is a ForeignKey that refers to Desciplina. You likely want to filter on the titulo field of that Desciplina, so then you should add the lookup to that field, like:

    queryset_list = queryset_list.filter(título__titulo__icontains=keywords)
    # …
    queryset_list = queryset_list.filter(título__titulo__icontains=manual_disciplina)
    #                                            ^ field
    #                                    ^ foreign key   ^ lookup