【问题标题】:Django save model with anonymous userDjango 使用匿名用户保存模型
【发布时间】:2012-12-07 11:33:42
【问题描述】:

我有一个 Django 模型:

class Project(models.Model):
    user = models.ForeignKey(User)
    zipcode = models.CharField(max_length=5)
    module = models.ForeignKey(Module)

在我看来.py:

def my_view(request):  
    ...
    project = Project.objects.create(
                  user=request.user,
                  product=product_instance,
                  ...
              )
    project.save()

我希望能够将用户保存为经过身份验证的用户或 AnonymousUser(我可以稍后更新)。但是,如果我没有登录,我会收到此错误:

ValueError: Cannot assign "<django.utils.functional.SimpleLazyObject object at 0x1b498d0>": "Project.user" must be a "User" instance.

我猜 Django 不会保存 AnonymousUser,因为它不是 User 模型中定义的用户。我是否需要将匿名用户添加到 User 模型中,还是我遗漏了什么?

非常感谢任何帮助。

【问题讨论】:

    标签: django django-models django-views django-authentication


    【解决方案1】:

    user 字段是ForeignKey。这意味着它必须引用某个用户

    根据定义,AnonymousUser 没有用户:在 Django 中,没有 AnonymousUserAAnonymousUserB。它们都是一样的:AnonymousUser

    结论:您不能将AnonymousUser 放入User ForeignKey


    不过,您的问题的解决方案非常简单:当 User 是匿名的时,只需将该字段留空即可。为此,您需要允许它:

    user = models.ForeignKey(User, blank = True, null = True)
    

    【讨论】:

    • 好的,太好了。因此,如果我在 AnonymousUser 上执行 user=request.user,那么该字段将为空白并且不会引发异常?
    • 将引发异常,因为您向该字段提供了不适当的数据。就做if request.user.is_authenticated(): project.user = request.user
    • 我是否还必须添加null-True,因为该字段不能是null
    • @DarwinTech null = True 影响如何存储空白值,而不影响是否可以存储。您可以添加它,但它不会改变在这里有所作为。
    • 好的,使用blank = True 我生成错误:IntegrityError: (1048, "Column 'user_id' cannot be null")。我向南跑反对这种变化,但它说什么都没有改变。
    猜你喜欢
    • 1970-01-01
    • 2011-01-14
    • 2012-12-06
    • 2014-02-08
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    • 2016-08-16
    • 2013-04-10
    相关资源
    最近更新 更多