根据用户名在Django中获取用户对象
我在一个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-async-messages里。
如果有任何建议或者指点我的错误(包括更好的方法!)我将非常感激。
2 个回答
2
你需要处理一种情况,就是当没有用户的时候,你可以用某种方式来应对,比如:
@app.task
def search(q, userstring):
try:
uid = User.objects.get(username=userstring)
except DoesNotExist, e:
return None
4
你查询用户的方式没有问题。问题在于你传递变量的顺序搞错了:任务是期待 (q, userstring)
,但你传递的是 (username, query)
。
不过我想知道,既然你可以直接传递用户实例的主键,为什么还要查询用户名呢:
def search(q, user_id):
uid = User.objects.get(pk=user_id)
然后调用它:
search.delay(form.instance.query, self.request.user.pk)