我在Django应用程序中的filter
或create
查询中使用了用户模型User
:
# FILTER queries
self_posts = (
Post.objects
.prefetch_related('stage')
.filter(Q(stage__assignee__isnull=False, stage__assignee=request.user))
.exclude(stage__slug__in=['vault', 'published'])
)
...
# CREATE one
if form.is_valid():
post = form.save(commit=False)
post.editor = request.user
post.save()
然后我将我的应用程序打包到可重用的Django模块中。与标准Django相比,我的User有几个额外的字段和方法,因此我创建了一个代理模型。在我的包中,它指向我的本地代理模型,但可以访问实际的";全局";用户,由主应用程序身份验证系统提供:
class User(UserModel): # Proxy user model in packaged app
class Meta:
proxy = True
class Meta:
permissions = (
("manage_authors", "Can manage authors"),
)
...
从那以后,在我的打包应用程序视图中,我不能将request.user
直接分配给类似User
的字段,但仍然可以在筛选查询中使用。
(Pdb) request.user
<SimpleLazyObject: <User: koowpjcs>>
(Pdb) request.user.user
<User: John Doe>
因此,Post.objects.filter(foo=request.user)
仍然可以工作,但post.editor = request.user
将失败:
Cannot assign "<SimpleLazyObject: <User: koowpjcs>>": "Post.editor" must be a "User" instance.
- 为什么会这样?它是被重新分配给可重用的应用程序还是定义自定义代理模型
- 在可重复使用的应用程序中替换
request.user
到request.user.user
的所有调用是否正确
我不认为post.editor = request.user
语句会失败,因为Django是如何与登录用户一起工作的
无论如何,您可以将整数值指定为
post.editor_id = request.user.id