Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django';类型';对象是不可编辑的_Python_Django_Django Rest Framework - Fatal编程技术网

Python Django';类型';对象是不可编辑的

Python Django';类型';对象是不可编辑的,python,django,django-rest-framework,Python,Django,Django Rest Framework,我使用Django Rest框架制作了一个简单的API,列出了他们尊敬的大学的学生。列出数据的url是http://127.0.0.1:8000/api/v1/students/。在试用了API之后,我得到了以下错误 TypeError at /api/v1/students/ 'type' object is not iterable Internal Server Error: /api/v1/students/ Traceback (most recent call last): F

我使用Django Rest框架制作了一个简单的API,列出了他们尊敬的大学的学生。列出数据的url是
http://127.0.0.1:8000/api/v1/students/
。在试用了API之后,我得到了以下错误

TypeError at /api/v1/students/
'type' object is not iterable

Internal Server Error: /api/v1/students/
Traceback (most recent call last):
  File "/Users/gilangramadhanilhami/Desktop/88sparses/shipment/tracking/lib/python3.6/site-packages/django/core/handlers/exception.py", line 35, in inner
    response = get_response(request)
  File "/Users/gilangramadhanilhami/Desktop/88sparses/shipment/tracking/lib/python3.6/site-packages/django/core/handlers/base.py", line 128, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/Users/gilangramadhanilhami/Desktop/88sparses/shipment/tracking/lib/python3.6/site-packages/django/core/handlers/base.py", line 126, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/Users/gilangramadhanilhami/Desktop/88sparses/shipment/tracking/lib/python3.6/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
    return view_func(*args, **kwargs)
  File "/Users/gilangramadhanilhami/Desktop/88sparses/shipment/tracking/lib/python3.6/site-packages/django/views/generic/base.py", line 69, in view
    return self.dispatch(request, *args, **kwargs)
  File "/Users/gilangramadhanilhami/Desktop/88sparses/shipment/tracking/lib/python3.6/site-packages/rest_framework/views.py", line 477, in dispatch
    request = self.initialize_request(request, *args, **kwargs)
  File "/Users/gilangramadhanilhami/Desktop/88sparses/shipment/tracking/lib/python3.6/site-packages/rest_framework/views.py", line 379, in initialize_request
    authenticators=self.get_authenticators(),
  File "/Users/gilangramadhanilhami/Desktop/88sparses/shipment/tracking/lib/python3.6/site-packages/rest_framework/views.py", line 273, in get_authenticators
    return [auth() for auth in self.authentication_classes]
TypeError: 'type' object is not iterable
我能够找到一些关于StackOverflow的解决方案,但没有太多的运气找到解决方案。我在
views.py
文件中使用
APIView
,我想了解使用
APIView
时发生这种情况的原因(此问题也会在使用
Viewset
时出现)

我已尝试更改权限更改权限没有帮助。同样,将
many=True
设置为“False”也不能解决问题

有人有什么想法吗?提前谢谢

以下是其他文件,以便更好地理解此问题

型号.py

from django.db import models

class University(models.Model):
    name = models.CharField(max_length=50)
    url = models.URLField(unique=True)

    class Meta:
        verbose_name = "University"
        verbose_name_plural = "Universities"

    def __str__(self):
        return self.name

class Student(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    university = models.ForeignKey(University, on_delete=models.CASCADE,)

    class Meta:
        verbose_name = "Student"
        verbose_name_plural = "Students"


    def __str__(self):
        return '%s %s' % (self.first_name, self.last_name)
from rest_framework import serializers

from . import models

class StudentSerializer(serializers.ModelSerializer):
    class Meta:
        fields = (
            'id',
            'first_name',
            'last_name',
            'university'
        )
        model = models.Student

class UniversitySerializer(serializers.ModelSerializer):
    class Meta:
        fields = (
            'id',
            'name',
            'url'
        )
        model = models.University
from rest_framework.views import APIView
from rest_framework.response import Response

from . import models
from . import serializers

class ListStudent(APIView):
    def list(self, request, format=None):
        students = models.Student.objects.all()
        serializer = serializers.StudentSerializer(students, many=True)
        return Response(serializer.data)
from django.urls import path

from . import views

urlpatterns = [
    path('', views.ListStudent.as_view(), name='student_list')
]
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api-auth/', include('rest_framework.urls', namespace='rest_framework')),
    path('api/v1/students/', include(('students.urls','students'), namespace='students')),
]
序列化程序.py

from django.db import models

class University(models.Model):
    name = models.CharField(max_length=50)
    url = models.URLField(unique=True)

    class Meta:
        verbose_name = "University"
        verbose_name_plural = "Universities"

    def __str__(self):
        return self.name

class Student(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    university = models.ForeignKey(University, on_delete=models.CASCADE,)

    class Meta:
        verbose_name = "Student"
        verbose_name_plural = "Students"


    def __str__(self):
        return '%s %s' % (self.first_name, self.last_name)
from rest_framework import serializers

from . import models

class StudentSerializer(serializers.ModelSerializer):
    class Meta:
        fields = (
            'id',
            'first_name',
            'last_name',
            'university'
        )
        model = models.Student

class UniversitySerializer(serializers.ModelSerializer):
    class Meta:
        fields = (
            'id',
            'name',
            'url'
        )
        model = models.University
from rest_framework.views import APIView
from rest_framework.response import Response

from . import models
from . import serializers

class ListStudent(APIView):
    def list(self, request, format=None):
        students = models.Student.objects.all()
        serializer = serializers.StudentSerializer(students, many=True)
        return Response(serializer.data)
from django.urls import path

from . import views

urlpatterns = [
    path('', views.ListStudent.as_view(), name='student_list')
]
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api-auth/', include('rest_framework.urls', namespace='rest_framework')),
    path('api/v1/students/', include(('students.urls','students'), namespace='students')),
]
视图.py

from django.db import models

class University(models.Model):
    name = models.CharField(max_length=50)
    url = models.URLField(unique=True)

    class Meta:
        verbose_name = "University"
        verbose_name_plural = "Universities"

    def __str__(self):
        return self.name

class Student(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    university = models.ForeignKey(University, on_delete=models.CASCADE,)

    class Meta:
        verbose_name = "Student"
        verbose_name_plural = "Students"


    def __str__(self):
        return '%s %s' % (self.first_name, self.last_name)
from rest_framework import serializers

from . import models

class StudentSerializer(serializers.ModelSerializer):
    class Meta:
        fields = (
            'id',
            'first_name',
            'last_name',
            'university'
        )
        model = models.Student

class UniversitySerializer(serializers.ModelSerializer):
    class Meta:
        fields = (
            'id',
            'name',
            'url'
        )
        model = models.University
from rest_framework.views import APIView
from rest_framework.response import Response

from . import models
from . import serializers

class ListStudent(APIView):
    def list(self, request, format=None):
        students = models.Student.objects.all()
        serializer = serializers.StudentSerializer(students, many=True)
        return Response(serializer.data)
from django.urls import path

from . import views

urlpatterns = [
    path('', views.ListStudent.as_view(), name='student_list')
]
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api-auth/', include('rest_framework.urls', namespace='rest_framework')),
    path('api/v1/students/', include(('students.urls','students'), namespace='students')),
]
学生/url.py

from django.db import models

class University(models.Model):
    name = models.CharField(max_length=50)
    url = models.URLField(unique=True)

    class Meta:
        verbose_name = "University"
        verbose_name_plural = "Universities"

    def __str__(self):
        return self.name

class Student(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    university = models.ForeignKey(University, on_delete=models.CASCADE,)

    class Meta:
        verbose_name = "Student"
        verbose_name_plural = "Students"


    def __str__(self):
        return '%s %s' % (self.first_name, self.last_name)
from rest_framework import serializers

from . import models

class StudentSerializer(serializers.ModelSerializer):
    class Meta:
        fields = (
            'id',
            'first_name',
            'last_name',
            'university'
        )
        model = models.Student

class UniversitySerializer(serializers.ModelSerializer):
    class Meta:
        fields = (
            'id',
            'name',
            'url'
        )
        model = models.University
from rest_framework.views import APIView
from rest_framework.response import Response

from . import models
from . import serializers

class ListStudent(APIView):
    def list(self, request, format=None):
        students = models.Student.objects.all()
        serializer = serializers.StudentSerializer(students, many=True)
        return Response(serializer.data)
from django.urls import path

from . import views

urlpatterns = [
    path('', views.ListStudent.as_view(), name='student_list')
]
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api-auth/', include('rest_framework.urls', namespace='rest_framework')),
    path('api/v1/students/', include(('students.urls','students'), namespace='students')),
]
url.py

from django.db import models

class University(models.Model):
    name = models.CharField(max_length=50)
    url = models.URLField(unique=True)

    class Meta:
        verbose_name = "University"
        verbose_name_plural = "Universities"

    def __str__(self):
        return self.name

class Student(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    university = models.ForeignKey(University, on_delete=models.CASCADE,)

    class Meta:
        verbose_name = "Student"
        verbose_name_plural = "Students"


    def __str__(self):
        return '%s %s' % (self.first_name, self.last_name)
from rest_framework import serializers

from . import models

class StudentSerializer(serializers.ModelSerializer):
    class Meta:
        fields = (
            'id',
            'first_name',
            'last_name',
            'university'
        )
        model = models.Student

class UniversitySerializer(serializers.ModelSerializer):
    class Meta:
        fields = (
            'id',
            'name',
            'url'
        )
        model = models.University
from rest_framework.views import APIView
from rest_framework.response import Response

from . import models
from . import serializers

class ListStudent(APIView):
    def list(self, request, format=None):
        students = models.Student.objects.all()
        serializer = serializers.StudentSerializer(students, many=True)
        return Response(serializer.data)
from django.urls import path

from . import views

urlpatterns = [
    path('', views.ListStudent.as_view(), name='student_list')
]
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api-auth/', include('rest_framework.urls', namespace='rest_framework')),
    path('api/v1/students/', include(('students.urls','students'), namespace='students')),
]

我认为这是个小错误。我的
'DEFAULT\u AUTHENTICATION\u CLASSES'
如下所示

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.SessionAuthentication'

    ),
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticatedOrReadOnly'
    ),
}
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.SessionAuthentication',

    ),
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticatedOrReadOnly',
    ),
}
这里我缺少的是一个简单的
。应该是这样的

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.SessionAuthentication'

    ),
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticatedOrReadOnly'
    ),
}
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.SessionAuthentication',

    ),
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticatedOrReadOnly',
    ),
}

我意识到“iterable”这个词的意思。希望这能有所帮助。

还有什么可以追溯的吗?你能设置DEBUG=True吗?@DanielRoseman我已经编辑了这个问题,并对错误做了一些额外的描述。这也是DEBUG=TrueWell,这似乎与您发布的代码无关。你能显示你的默认认证类设置吗?没关系,我已经解决了。
DEFAULT\u AUTHENTICATION\u CLASSES
看起来像这样的
'DEFAULT\u AUTHENTICATION\u CLASSES':('rest\u framework.AUTHENTICATION.SessionAuthentication'),
。我缺少一个逗号,因为该值应该是一个元组。无论如何,谢谢你:)