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

问题描述

我在我的 Django 应用程序中在 Userfilter 查询中使用了用户模型 create

# 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 模块中。由于我的 User 与标准 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.
  1. 为什么会这样?是与可重复使用的应用有关还是与定义自定义代理模型有关?
  2. 在可重复使用的应用中将 request.user 的所有调用替换为 request.user.user 是否正确?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)