【发布时间】:2021-04-04 10:33:34
【问题描述】:
我在我的 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 相比,我的用户有几个额外的字段和方法,我创建了一个代理模型。在我的包中,它指向我的本地代理模型,但可以访问由主应用程序身份验证系统提供的实际“全局”用户:
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是否正确?
【问题讨论】:
标签: django django-models django-authentication django-apps