【问题标题】:Django user record not found找不到 Django 用户记录
【发布时间】:2020-06-11 17:55:57
【问题描述】:

我正在尝试通过使用客户端模型来扩展 django 中的用户模型(这可能不是理想的方式,但那艘船已经航行了)。当我尝试访问模板中的用户记录时,出现错误:

No Client matches the given query

models.py

class Client(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)

views.py

def update_client_details(request):
    if request.user.is_authenticated:
        user = request.user
        # print('pk', user.pk)
        client = get_object_or_404(Client, pk=user.pk)

如果我打印 user.pk,我会看到我所期望的。

为什么它不返回一个对象?

【问题讨论】:

    标签: python django


    【解决方案1】:

    因为您在get_object_or_404(Client, pk=user.pk) 中使用user.pk,因为它会尝试在Client 模型中找到pk,但是在客户端模型中,没有任何可用的数据根据​​get_object_or_404(Client, pk=user.pk) 中的给定主键,因为这个@ 987654326@ 是用户的pk

    所以,如果你想根据user 获取对象,你必须写如下......

    client = get_object_or_404(Client, user=user)
    

    或者你可以使用简单的方法......

    client_obj = Client.objects.get(user=request.user)
    

    【讨论】:

    • 更新了我的答案。
    【解决方案2】:

    因为,您使用用户模型 id 查询了客户端模型。 你可以使用这个查询

    client = get_object_or_404(Client, pk=user.pk)
    

    而不是

    client = get_object_or_404(Client, user=user)
    

    如果要检查是否存在与 request.user 相关的客户端,可以使用以下查询:

    client = Client.objects.filter(user=request.user).first() 
    # this query returns None if there is no client related with your user.
    if client:
        #your update processes
    else:
        # your client not exist commands
    

    您也可以使用hasattr 方法。有样张here

    【讨论】:

    • 您的数据库中有与该用户相关的客户记录吗?您能查一下吗?
    • 啊啊啊!从来没想过。所以我需要检查并创建它是否不存在?
    • 这完全取决于你的程序逻辑。但我认为你不应该在这里检查它。因为您对更新过程的看法。但是您可以检查是否有任何与客户端相关的 request.user 对象
    • 是的,用户对象在那里,看我的问题,我可以打印user.pk
    • 是的,你有用户对象,但你可能没有定义任何连接到用户的客户端。你必须检查它。
    【解决方案3】:

    使用this answer 我意识到我需要添加:

    profile, created = Profile.objects.get_or_create(user=request.user)
    

    views.py

    所以 views.py 现在看起来像:

    def update_client_details(request):
        if request.user.is_authenticated:
            user = request.user
            profile, created = Profile.objects.get_or_create(user=request.user)
    

    我可以访问用户和个人资料数据

    如果用户的配置文件不存在,则会创建它

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-21
      • 2019-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-21
      • 1970-01-01
      相关资源
      最近更新 更多