Django: filter() 无返回结果

1 投票
3 回答
1889 浏览
提问于 2025-04-16 15:46

当我尝试使用get()的时候,它给我返回了一个“多个对象被返回”的错误。我试着用filter,但什么都没有返回。以下是我的代码:

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

它什么都没有返回。希望这只是个语法错误,而不是我需要重写程序的错误。提前谢谢你们。

get:

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>}

3 个回答

0

如果Score表里有一个user字段,这个字段是指向User表的外键,并且你有一个本地变量user,这个变量也是一个User对象,那么你应该这样做:

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

你可能遇到了数据集损坏的问题,或者你的模型没有像你想的那样正常工作。总之,你让用户这个标识符在分数上变得不唯一了。

至于为什么过滤器没有返回任何结果,可能是因为你调用它的方式不对?

filter(user=user.id)

get(user=request.user)

这让我觉得用户是一个远程键,由django自动处理,而不是一个简单的数字。你使用过滤器的时候用的是简单的数字,而用获取的时候则是更符合对象关系的方式。

4

你在错误追踪中使用的 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 数据是如何存储的。

撰写回答