【问题标题】:'QuerySet' object has no attribute 'email''QuerySet' 对象没有属性 'email'
【发布时间】:2021-06-12 01:10:36
【问题描述】:

我发现 QuerySet 对象没有属性“电子邮件”的错误..我尽力解决问题但找不到解决方案..

from django.http import HttpResponse
from loginsystem.models import newUser
from django.contrib import messages
from django.core.exceptions import MultipleObjectsReturned

 def login(request):
    if request.method=='POST':
        try:
            userdetails=newUser.objects.filter(email=request.POST['email'] , password=request.POST['password'])
            print("username=", userdetails)
            request.session['email']=userdetails.email
            return render(request, 'home.html')

谢谢

【问题讨论】:

    标签: python django django-rest-framework django-forms


    【解决方案1】:

    在您的用户详细信息中添加.first()

    userdetails=newUser.objects.filter(email=request.POST['email'] , password=request.POST['password']).first()
    

    过滤器返回QuerySet[]get_object_or_404 是返回实例,所以你必须使用.first() 来获取QuerySet[] 中的用户,或者使用get_object_or_404

    【讨论】:

    • 请解释原因!
    【解决方案2】:

    使用“get”而不是“filter”。

    过滤器:返回多个对象。 get:返回单个对象。您正在使用 userdetails.email 访问电子邮件,因此 userdetails 必须是单个对象。

     def login(request):
        if request.method=='POST':
            try:
                userdetails=newUser.objects.get(email=request.POST['email'] , password=request.POST['password'])
                print("username=", userdetails)
                request.session['email']=userdetails.email
                return render(request, 'home.html')
    

    【讨论】:

    • 请解释为什么!
    • 过滤器:返回多个对象。 get:返回单个对象。您正在使用 userdetails.email 访问电子邮件,因此 userdetails 必须是单个对象。
    • 谢谢。您可以将其添加到您的答案中吗?如果你这样做,我会投票赞成:-)
    • @ShaidHasanShawon 先生,我使用 .get 而不是 .filter,但它在 /login 处显示 MultipleObjectsReturned。
    • MultipleObjectsReturned:这意味着您从 request.POST['email'] 收到的电子邮件在 newUser 模型中不是唯一的。您有多个用户使用相同的电子邮件。如果您将电子邮件模型归档为唯一 = True,那就更好了。在做 unique=True 这个之前。转到 dajngo 管理面板并将所有重复的电子邮件删除为唯一的,否则,您将收到迁移错误。
    【解决方案3】:

    filter 方法返回一个列表(即 Queryset),而不是您想要的唯一值。您应该改用 get 方法

    userdetails=newUser.objects.get(email=request.POST['email'] , password=request.POST['password'])
    

    userdetails=newUser.objects.filter(email=request.POST['email'] , password=request.POST['password'])[0]
    

    注意:获取非唯一查询,即多个对象将引发 MultipleObjectsReturned 异常。确保获取索引对象。 如果您不确定对象是否唯一,请执行

    userdetails=newUser.objects.filter(email=request.POST['email'] , password=request.POST['password'])
    if userdetails.exists():
        userdetails = userdetails[0]
    

    【讨论】:

    • 用get添加多对象的情况!
    猜你喜欢
    • 1970-01-01
    • 2020-10-31
    • 2016-09-22
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多