【问题标题】:FieldError while using Q objects- cannot resolve keyword __ into field使用 Q 对象时出现 FieldError - 无法将关键字 __ 解析为字段
【发布时间】:2018-12-25 23:27:08
【问题描述】:

对 django 相当陌生。 索引页的构造视图。在文档中使用“使用Q 对象的复杂查找”。 遇到以下错误

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

无法将关键字“album_title_icontains”解析为字段。选择 是:album_favorite、album_logo、album_title、艺术家、流派、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})

我们将不胜感激。提前致谢。

【问题讨论】:

    标签: python django django-models


    【解决方案1】:

    您的观点是正确的,只是一个小错误。你只需要 双下划线:- __
    供您查找。 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)
    

    【讨论】:

      【解决方案2】:

      你需要 dundee('__') 双下划线来使用过滤器。

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

      【讨论】:

      • 愚蠢的我。非常感谢。
      猜你喜欢
      • 2021-05-23
      • 2013-10-09
      • 2019-05-26
      • 1970-01-01
      • 2015-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多