Django:Filter()不返回任何东西

Posted

技术标签:

【中文标题】Django:Filter()不返回任何东西【英文标题】:Django: Filter() not returning anything 【发布时间】:2011-08-05 23:13:48 【问题描述】:

当我尝试使用 get() 时,它给了我一个返回多个对象的错误。我尝试了过滤器,它绝对没有返回任何内容。这是我的代码:

latest_poll_list = Score.objects.filter(user=user.id)

它不返回任何东西。希望这只是一个语法错误;不是我必须重新编写程序的错误。提前致谢。

得到:

Environment:


Request Method: GET
Request URL: http://localhost:8000/scores/

Django Version: 1.3
Python Version: 2.5.5
Installed Applications:
['django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.sites',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'django.contrib.admin',
 'django.contrib.admindocs',
 'es']
Installed Middleware:
('django.middleware.common.CommonMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware')


Traceback:
File "/usr/local/lib/python2.5/site-packages/django/core/handlers/base.py" in get_response
  111.                         response = callback(request, *callback_args, **callback_kwargs)
File "/Users/julian/Documents/EpicScore/es/views.py" in scoreindex
  30.     latest_poll_list = Score.objects.get(user=request.user)
File "/usr/local/lib/python2.5/site-packages/django/db/models/manager.py" in get
  132.         return self.get_query_set().get(*args, **kwargs)
File "/usr/local/lib/python2.5/site-packages/django/db/models/query.py" in get
  351.                 % (self.model._meta.object_name, num, kwargs))

Exception Type: MultipleObjectsReturned at /scores/
Exception Value: get() returned more than one Score -- it returned 3! Lookup parameters were     'user': <User: jmeyer>

【问题讨论】:

您能否发布get() 调用产生的确切回溯? 【参考方案1】:

您在回溯中的get 调用不等于您问题中的filter 调用:

latest_poll_list = Score.objects.get(user=request.user)
    !=
latest_poll_list = Score.objects.filter(user=user.id)

在第一次你传递一个对象user 作为参数,在第二次你传递一个 id 值(可能是一个整数)。此外,如果没有看到您的其余代码,我们不知道 userrequest.user 是否相同。

如果您只是将get 换成filter,您应该会得到预期的结果:

latest_poll_list = Score.objects.filter(user=request.user)

否则你可以这样做:

latest_poll_list = Score.objects.filter(user__id=request.user.id)

如果您传入user 对象,则查询在内部将user.id 与数据库列user_id 进行比较,这就是ForeignKey 的数据的实际存储方式。

【讨论】:

【参考方案2】:

您的数据集已损坏,或者您的模型可能没有像您想象的那样工作。不知何故,您设法使用户不是分数的唯一标识符。

至于为什么过滤器没有返回任何内容,可能是因为您的调用方式不同?

filter(user=user.id)

对比

get(user=request.user)

这让我相信用户是由 django 自动处理的远程密钥,而不是原始数字。您对 filter 的使用是使用原始数字,您对 get 的使用是使用更惯用的 object-as-relation 方式。

【讨论】:

它没有损坏。我希望它返回多个值,这就是我使用过滤器的原因【参考方案3】:

如果Score 表有一个user 字段,它是User 表的ForeignKey,并且你有一个局部变量user,它也是一个User 对象,那么你应该这样做

latest_poll_list = Score.objects.filter(user=user)

【讨论】:

以上是关于Django:Filter()不返回任何东西的主要内容,如果未能解决你的问题,请参考以下文章

django model中get()和filter()方法的区别

django model filter变量为空则筛选全部

Django,检测object.filter是不是返回0个对象

django在验证登录页面时遇到的数据查询问题

django-filter 在参数错误时返回空查询集

Django 字段查询谓词表