首页 > 解决方案 > Django 错误相关字段的查找无效:​​icontains

问题描述

我正在使用外键在 django 中进行搜索,但它显示此错误“相关字段获取无效查找:icontains”我在这里发现了类似的情况,但没有奏效,我认为错误出现在 queryset_list 行中的 views.py 中。

模型.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

使用外部和图标进行搜索时,它不起作用,但对于其他字段,它可以工作 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)

标签: pythondjango-modelsdjango-viewsdjango-queryset

解决方案


这里tituloForeignKeyDesciplina. 您可能希望过滤 that 的titulo字段Desciplina,因此您应该将查找添加到该字段,例如:

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

推荐阅读