Django: Filter () ничего не возвращает - PullRequest
1 голос
/ 15 апреля 2011

Когда я пытаюсь использовать 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>}

Ответы [ 3 ]

4 голосов
/ 15 апреля 2011

Ваш get вызов в трассировке не эквивалентен filter вызову в вашем вопросе:

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

В первом вы передаете объект, user в качестве аргумента, во втором вы передаете значение id (вероятно, целое число). Кроме того, не видя остальную часть вашего кода, мы не знаем, совпадают ли user и request.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.

1 голос
/ 15 апреля 2011

У вас поврежденный набор данных, или, возможно, ваши модели не работают так, как вы думаете.Каким-то образом вам удалось сделать так, чтобы пользователь не являлся уникальным идентификатором для Score.

Что касается того, почему фильтр ничего не возвращает, может, это потому, что вы называете его по-другому?1004 *

против

get(user=request.user)

Это наводит меня на мысль, что пользователь является удаленным ключом, который автоматически обрабатывается django, а не необработанным числом.При использовании фильтра используется необработанное число, при использовании get используется более идиоматический способ отношения объекта к объекту.

0 голосов
/ 15 апреля 2011

Если в таблице Score есть поле user, которое является ForeignKey для таблицы User, и у вас есть локальная переменная user, которая также является объектом User, тогда вы должны сделать

latest_poll_list = Score.objects.filter(user=user)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...