django - AttributeError:'AnonymousUser'对象没有属性'todo'

Posted

技术标签:

【中文标题】django - AttributeError:\'AnonymousUser\'对象没有属性\'todo\'【英文标题】:django - AttributeError: 'AnonymousUser' object has no attribute 'todo'django - AttributeError:'AnonymousUser'对象没有属性'todo' 【发布时间】:2020-10-13 13:27:11 【问题描述】:

我正在尝试获取属于该用户的所有待办事项,

这是我的待办事项模型

from django.db import models
from django.contrib.auth.models import User

class Todo(models.Model):
    _id = models.AutoField(primary_key = True)
    title = models.CharField(max_length = 250)
    content = models.TextField()
    created_at = models.DateField()
    complete = models.BooleanField(default = False)
    owner = models.ForeignKey(User, related_name = 'todo', on_delete = models.CASCADE, null = True)

这是我的待办事项视图集

from rest_framework import viewsets, permissions
from .models import Todo
from .serializers import TodoSerializer

class TodoViewSet(viewsets.ModelViewSet):
    permissions_classes = [
        permissions.IsAuthenticated
    ] 
    
    serializer_class = TodoSerializer

    def query(self):
        return self.request.user.todo.all()

    def create(self, serializer):
        serializer.save(owner = self.request.user)

当我向 /api/todo/ 发送请求时(待办事项休息 api) 我收到此错误:

AttributeError: 'AnonymousUser' object has no attribute 'todo'

可能是什么问题?我应该创建用户模型吗?目前我正在使用 django 用户。

【问题讨论】:

request.user 是用户对象吗?看起来不像。是的,您必须创建用户模型。 【参考方案1】:

可能是什么问题?

这里的问题是你没有登录。那么为什么请求通过你问?由于用户必须登录,它不应该停止吗?问题背后的问题是一个错字:permissions_classes 应该是permission_classes

现在你会得到一个不同的错误。但是一旦你登录,一切都应该工作:) 所以,不。无需创建自定义用户模型。

当您未登录 django 时,rest 框架将 request.user 设置为 AnonymousUser,这与普通的 django User 不同。这就是request.user 没有todo 属性的原因。

【讨论】:

认为您的意思是“当您未登录时”注册。 DRF 中的匿名用户【参考方案2】:

问题是用户未登录,请确保您的数据库中有活动用户并登录。然后在您的查询集中使用过滤器更新您的代码。

您需要在您的模型视图集中的查询集中使用 FILTER 检查下面的工作代码。

from rest_framework import viewsets, permissions
from .models import Todo
from .serializers import TodoSerializer

class TodoViewSet(viewsets.ModelViewSet):
    permission_classes = (permissions.IsAuthenticated,)

    serializer_class = TodoSerializer
    queryset = Todo.objects.all()


    def get_queryset(self):
        # after get all Todo then filtere by its owner and return the queryset
        todo = self.queryset.filter(owner=self.request.user)
        return todo

 
     # Also update the create method by overriding the perform_create method as below
     def perform_create(self, serializer_class):
         # todo is saved with the corresponding owner
        serializer_class.save(owner=self.request.user)

【讨论】:

【参考方案3】:

这是我创建的权限:

class IsManager(BasePermission):
    """
    Allows access only to Managers
    """
    def has_permission(self, request, view):
        return request.user.profession == 'M'

它正在返回:AttributeError: 'AnonymousUser' 对象没有属性 'todo'

    首先应该有:

    permission_classes = [IsAuthenticated]

    我在编写自己的权限时遇到了同样的问题。主要 问题是我添加了不在 AnonymousUser (未经过身份验证的用户)中的字段,因此 Django 在 AnonymousUser (未经过身份验证的用户)中找不到任何字段。这就是我在views.py中添加的原因:

    permission_classes = [(IsAuthenticated & IsManager)]

一切正常。希望此评论对您有所帮助。

【讨论】:

以上是关于django - AttributeError:'AnonymousUser'对象没有属性'todo'的主要内容,如果未能解决你的问题,请参考以下文章

Django 3:AttributeError:'AdminSite'对象没有属性'Register' [关闭]

Django 2.2 + AttributeError:'str'对象没有属性'decode'

AttributeError:模块'django.db.models'没有属性'DataField'[关闭]

AttributeError:模块 'django.contrib.postgres.fields' 没有属性 'JSONField'

AttributeError:'str'对象没有属性'regex'django 1.9

AttributeError: 'ManyToManyDescriptor' 对象没有属性 'all' - django