在Django中从用户名获取用户对象

5
我正在尝试在Django Celery任务中使用以下代码。
@app.task
def search(q, userstring):
    uid = User.objects.get(username=userstring)
    messages.info(uid, 'Initiating search in background.')
    [...]

我的想法是这样调用它:

search.delay(self.request.user.get_username(), form.instance.query)

我收到了以下错误提示:
>[2014-06-05 12:04:04,352: ERROR/MainProcess] Task listthings.tasks.search[5aaa77b4-c7be-4d6a-9127-626e63d0dfbe] raised unexpected: DoesNotExist('User matching query does not >exist.',)
Traceback (most recent call last):
  File "/webapps/wcw/local/lib/python2.7/site-packages/celery/app/trace.py", line 240, in trace_task
    R = retval = fun(*args, **kwargs)
  File "/webapps/wcw/local/lib/python2.7/site-packages/celery/app/trace.py", line 437, in __protected_call__
    return self.run(*args, **kwargs)
  __File "/webapps/wcw/webcamwatch/listcams/tasks.py", line 44, in search
    uid = User.objects.get(username=userstring)__
  File "/webapps/wcw/local/lib/python2.7/site-packages/django/db/models/manager.py", line 151, in get
    return self.get_queryset().get(*args, **kwargs)
  File "/webapps/wcw/local/lib/python2.7/site-packages/django/db/models/query.py", line 310, in get
    self.model._meta.object_name)
Exception: User matching query does not exist.

我试图实现的是将活跃用户从视图传递到django-aync-messages。欢迎提出任何建议或指出我的错误(包括更好的方法!)。

看起来没有名为'userstring'的用户。你确定userstring的值是正确的吗? - Andres
2个回答

4

您查询用户的方式没有问题。您代码的问题在于您传递变量的顺序错误:任务需要(q, userstring),但您传递的是(username, query)

然而,我想知道为什么要查询用户名,当您可以简单地传递User实例的主键:

def search(q, user_id):
    uid = User.objects.get(pk=user_id)

并命名为:

search.delay(form.instance.query, self.request.user.pk)

丹尼尔,非常感谢 - 你是完全正确的。哦,我的脸真红 :) - arashiyama

2

当某些情况下没有用户时,您需要以某种方式处理,例如:

@app.task
def search(q, userstring):
    try:
        uid = User.objects.get(username=userstring)
    except DoesNotExist, e:
        return None

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接