使用Q对象时出现FieldError-无法将关键字__解析为字段

时间:2018-07-18 06:48:52

标签: python django django-models

django的新手。 索引页的结构视图。如文档中所述,使用“使用Q对象进行复杂查找”。 遇到以下错误

  

请求方法:GET请求URL:     http://127.0.0.1:8000/music/?q=wretched Django版本:1.11.12   异常类型:FieldError异常值:

     

无法将关键字“专辑标题_图标”解析为字段。选择项   是:专辑收藏,专辑徽标,专辑标题,艺术家,流派,ID,歌曲,   用户,user_id

     

异常位置:     /usr/lib64/python2.7/site-packages/django/db/models/sql/query.py在   names_to_path,第1352行Python可执行文件:/ usr / bin / python Python   版本:2.7.15

引起问题的函数视图为index()(如下所示)

def index(request):
    if not request.user.is_authenticated():
        return render(request, 'music/login_form.html')
    else:
        albums= Album.objects.filter(user=request.user)
        songs=Song.objects.filter(album=albums)
        num= Album.objects.filter(user=request.user).count()
        req= request.GET.get("q")
        if req:
            albums= albums.filter(
                Q(album_title_icontains=req) |
                Q(artist_icontains=req)
            ).distinct()
            songs=songs.filter(
                Q(song_title_icontains=req)
            ).distinct()
        context={
        'object_list': albums,
        'num': num,
        'songs': songs
        }
        return render(request, 'music/index.html', context)

models.py 文件文件如下所示

from __future__ import unicode_literals

from django.contrib.auth.models import Permission, User
from django.db import models
from django.core.urlresolvers import reverse



class Album(models.Model):
    user= models.ForeignKey(User, default=1)
    artist= models.CharField(max_length=100)
    album_title= models.CharField(max_length=200)
    genre= models.CharField(max_length=50)
    album_logo= models.FileField()
    album_favorite= models.BooleanField(default=False)


    def get_absolute_url(self):
        return reverse('music:detail',kwargs={'pk':self.pk})

    def __str__(self):
        return self.album_title+' by '+ self.artist

class Song(models.Model):
    album= models.ForeignKey(Album, on_delete=models.CASCADE)
    song_title= models.CharField(max_length=200)
    audio_file= models.FileField(default='')
    is_favorite= models.BooleanField(default=False)
    def __str__(self):
        return self.song_title

    def get_absolute_url(self):
        alb= self.album
        return reverse('music:detail',kwargs={'pk':alb.pk})

我们将不胜感激。预先感谢。

2 个答案:

答案 0 :(得分:2)

您需要使用dundee('__')双下划线才能使用过滤器。

albums= albums.filter(
                Q(album_title__icontains=req) |
                Q(artist__icontains=req)
            ).distinct()
            songs=songs.filter(
                Q(song_title__icontains=req)
            ).distinct()

答案 1 :(得分:0)

您的观点是正确的,只是一个很小的错字。您只需要双下划线:-    __
 为您的查询。 From docs

正确-Views.py

def index(request):
if not request.user.is_authenticated():
    return render(request, 'music/login_form.html')
else:
    albums= Album.objects.filter(user=request.user)
    songs=Song.objects.filter(album=albums)
    num= Album.objects.filter(user=request.user).count()
    req= request.GET.get("q")
    if req:
        albums= albums.filter(
            Q(album_title__icontains=req) |
            Q(artist__icontains=req)
        ).distinct()
        songs=songs.filter(
            Q(song_title__icontains=req)
        ).distinct()
    context={
    'object_list': albums,
    'num': num,
    'songs': songs
    }
    return render(request, 'music/index.html', context)