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