【问题标题】:SimpleLazyObject instead of User in re-usable Django app?可重复使用的 Django 应用程序中的 SimpleLazyObject 而不是 User?
【发布时间】:2021-04-04 10:33:34
【问题描述】:

我在我的 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 相比,我的用户有几个额外的字段和方法,我创建了一个代理模型。在我的包中,它指向我的本地代理模型,但可以访问由主应用程序身份验证系统提供的实际“全局”用户:

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 是否正确?

【问题讨论】:

    标签: django django-models django-authentication django-apps


    【解决方案1】:

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

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

    post.editor_id = request.user.id

    【讨论】:

    • 但它肯定属于Cannot assign "&lt;SimpleLazyObject: &lt;User: koowpjcs&gt;&gt;": "Post.editor" must be a "User" instance。请注意,我在可重复使用的应用程序中使用代理模型。
    猜你喜欢
    • 2019-11-02
    • 2021-10-07
    • 1970-01-01
    • 2012-03-14
    • 1970-01-01
    • 2010-12-05
    • 2014-10-13
    • 2013-11-01
    • 1970-01-01
    相关资源
    最近更新 更多