首页 > 解决方案 > 可重复使用的 Django 应用程序中的 SimpleLazyObject 而不是 User?

问题描述

User我在我的 Django 应用程序中使用了用户模型filtercreate类似的查询:

# 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.
  1. 为什么会发生?它是否适用于可重用的应用程序或定义自定义代理模型?
  2. request.user替换可request.user.user重用应用程序中的所有调用是否正确?

标签: djangodjango-modelsdjango-authenticationdjango-apps

解决方案


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

无论如何,您可以将数值分配为目录

post.editor_id = request.user.id


推荐阅读