【问题标题】:Django : Object has no attribute _set'Django:对象没有属性_set'
【发布时间】:2017-10-10 22:41:16
【问题描述】:

我在 django 的项目中有这段代码:

def all_songs(request, filter_by):
    if not request.user.is_authenticated():
        return render(request, 'music/login.html')
    else:
        try:
            song_ids = []
            for album in Album.objects.all():
                for song in album.song_set.all():
                    song_ids.append(song.pk)
            users_songs = Song.objects.filter(pk__in=song_ids)
            for album in GenericAlbum.objects.all():
                for song in album.genericsong_set.all():
                    song_ids.append(song.pk)
            generic_songs = GenericSong.objects.filter(pk__in=song_ids)
        except Album.DoesNotExist:
            users_songs = []
        except GenericAlbum.DoesNotExist:
            generic_songs = []
        return render(request, 'music/songs.html', {
            'song_list_all': users_songs,
            'generic_song_list': generic_songs,
            'filter_by': filter_by,
        })

当我转到 allSong 页面时,我收到此错误:

AttributeError: 'NoneType' 对象没有属性 'split'

我认为一个变量允许一个无值,但我不知道女巫,我尝试了所有的,但仍然是同样的问题。

这是回溯:

Traceback (most recent call last):
  File "C:\Users\elmou\AppData\Local\Programs\Python\Python36-32\lib\socketserver.py", line 639, in process_request_thread
    self.finish_request(request, client_address)
  File "C:\Users\elmou\AppData\Local\Programs\Python\Python36-32\lib\socketserver.py", line 361, in finish_request
    self.RequestHandlerClass(request, client_address, self)
  File "C:\Users\elmou\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\core\servers\basehttp.py", line 99, in __init__
    super(WSGIRequestHandler, self).__init__(*args, **kwargs)
  File "C:\Users\elmou\AppData\Local\Programs\Python\Python36-32\lib\socketserver.py", line 696, in __init__
    self.handle()
  File "C:\Users\elmou\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\core\servers\basehttp.py", line 179, in handle
    handler.run(self.server.get_app())
  File "C:\Users\elmou\AppData\Local\Programs\Python\Python36-32\lib\wsgiref\handlers.py", line 144, in run
    self.close()
  File "C:\Users\elmou\AppData\Local\Programs\Python\Python36-32\lib\wsgiref\simple_server.py", line 35, in close
    self.status.split(' ',1)[0], self.bytes_sent
AttributeError: 'NoneType' object has no attribute 'split'

【问题讨论】:

  • 除了该错误之外,您还应该获得一个堆栈跟踪,它可以准确地告诉您发生了什么。它告诉你什么?
  • 我是 python 新手:/你能告诉我如何获取这个堆栈跟踪吗?
  • 如果您正在运行 django 网络服务器,它应该在黄色错误页面上。只需查找页面中开始提及您的 python 文件的部分。
  • @ImadElmouden 这是您在控制台中看到错误的输出。所有那些带有文件名、行号和已执行行的行。这将告诉我们错误在哪里,因为该视图中没有任何内容调用split(),因此无法立即看到问题所在。
  • 我添加了回溯

标签: python django


【解决方案1】:

尝试一下,您尝试从queryset 对象中获取pk,但是 pk 它是实例的属性而不是查询集,当您需要查询集中的值列表时,您可以使用values-list,并将默认添加到你的filter_by

def all_songs(request, filter_by=None):
    if not request.user.is_authenticated():
        return render(request, 'music/login.html')
    else:
        song_ids = []
        for album in Album.objects.all():
            song_ids.append(album.song_set.values_list('pk', flat=True))
        users_songs = Song.objects.filter(pk__in=song_ids)
        song_ids = []
        for album in GenericAlbum.objects.all():
            song_ids.append(album.genericsong_set.values_list('pk', flat=True))
        generic_songs = GenericSong.objects.filter(pk__in=song_ids)

        return render(request, 'music/songs.html', {
            'song_list_all': users_songs,
            'generic_song_list': generic_songs,
            'filter_by': filter_by,
        })

【讨论】:

  • 你是如何运行 django 的?
  • 我在 pycharm pro 中运行 django,django 版本 1.9.4
  • 并将默认值添加到您的filter_by
  • 对不起,我这样做了 def all_songs(request, filter_by=None): 什么也没发生:/
  • 尝试通过命令行运行django,python manage.py runserver
猜你喜欢
  • 2016-03-30
  • 1970-01-01
  • 2012-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-11
  • 2015-02-19
  • 2021-04-05
相关资源
最近更新 更多