在可重用的Django应用程序中使用SimpleLazyObject而不是User



我在Django应用程序中的filtercreate查询中使用了用户模型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.
  1. 为什么会这样?它是被重新分配给可重用的应用程序还是定义自定义代理模型
  2. 在可重复使用的应用程序中替换request.userrequest.user.user的所有调用是否正确

我不认为post.editor = request.user语句会失败,因为Django是如何与登录用户一起工作的

无论如何,您可以将整数值指定为

post.editor_id = request.user.id

相关内容

  • 没有找到相关文章

最新更新