Python Django rest api问题:hasattr():属性名称必须为字符串

Python Django rest api问题:hasattr():属性名称必须为字符串,python,django,python-3.x,django-models,django-rest-framework,Python,Django,Python 3.x,Django Models,Django Rest Framework,我正在创建一个简单的博客应用程序,并尝试转换django rest api。但是,我得到了这个错误 TypeError at/user/api/hasattr():属性名称必须是字符串 异常类型:在/user/api/ 异常值:hasattr():属性名称必须是字符串 这是我的models.py文件 from django.conf import settings from django.db import models from django.urls import reverse clas

我正在创建一个简单的博客应用程序,并尝试转换django rest api。但是,我得到了这个错误

TypeError at/user/api/hasattr():属性名称必须是字符串

异常类型:在/user/api/

异常值:hasattr():属性名称必须是字符串

这是我的models.py文件

from django.conf import settings
from django.db import models
from django.urls import reverse

class BlogPost(models.Model):
    author = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE)
    blog_title=models.CharField(max_length=200)
    blog_description=models.TextField()
    blog_pub=models.DateTimeField(auto_now_add=True)
    blog_update=models.DateTimeField(auto_now=True)


    def __str__(self):
        return self.blog_title


    def get_absolute_url(self):

        return reverse('blog:blog_post', kwargs={'pk': self.pk})
from rest_framework import serializers

from blog.models import BlogPost


class BlogPostSerializer(serializers.ModelSerializer):

    class Meta:
        fields=(
            'author',
            'blog_title',
            'blog_description',
        ),
        model=BlogPost
from django.urls import path,include

from .views import SignUpForm, UserProfiles
from .api.views import *


urlpatterns = [
    path('signup/',  SignUpForm.as_view(), name='signup'),
    path('profile/', UserProfiles.as_view(), name='profile'),
    path('api/', BlogPostListAPI.as_view(), name='asad'),
    path('api/<int:pk>', BlogPostListAPIDetail.as_view()),
]
这是我的serializers.py文件

from django.conf import settings
from django.db import models
from django.urls import reverse

class BlogPost(models.Model):
    author = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE)
    blog_title=models.CharField(max_length=200)
    blog_description=models.TextField()
    blog_pub=models.DateTimeField(auto_now_add=True)
    blog_update=models.DateTimeField(auto_now=True)


    def __str__(self):
        return self.blog_title


    def get_absolute_url(self):

        return reverse('blog:blog_post', kwargs={'pk': self.pk})
from rest_framework import serializers

from blog.models import BlogPost


class BlogPostSerializer(serializers.ModelSerializer):

    class Meta:
        fields=(
            'author',
            'blog_title',
            'blog_description',
        ),
        model=BlogPost
from django.urls import path,include

from .views import SignUpForm, UserProfiles
from .api.views import *


urlpatterns = [
    path('signup/',  SignUpForm.as_view(), name='signup'),
    path('profile/', UserProfiles.as_view(), name='profile'),
    path('api/', BlogPostListAPI.as_view(), name='asad'),
    path('api/<int:pk>', BlogPostListAPIDetail.as_view()),
]
这是views.py文件

from blog.models import BlogPost

from .serializers import BlogPostSerializer
from rest_framework import generics
from . import serializers
from . import serializers


class BlogPostListAPI(generics.ListCreateAPIView):
    queryset=BlogPost.objects.all()
    serializer_class=BlogPostSerializer


class BlogPostListAPIDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = BlogPost.objects.all()
    serializer_class = serializers.BlogPostSerializer
这是url.py文件

from django.conf import settings
from django.db import models
from django.urls import reverse

class BlogPost(models.Model):
    author = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE)
    blog_title=models.CharField(max_length=200)
    blog_description=models.TextField()
    blog_pub=models.DateTimeField(auto_now_add=True)
    blog_update=models.DateTimeField(auto_now=True)


    def __str__(self):
        return self.blog_title


    def get_absolute_url(self):

        return reverse('blog:blog_post', kwargs={'pk': self.pk})
from rest_framework import serializers

from blog.models import BlogPost


class BlogPostSerializer(serializers.ModelSerializer):

    class Meta:
        fields=(
            'author',
            'blog_title',
            'blog_description',
        ),
        model=BlogPost
from django.urls import path,include

from .views import SignUpForm, UserProfiles
from .api.views import *


urlpatterns = [
    path('signup/',  SignUpForm.as_view(), name='signup'),
    path('profile/', UserProfiles.as_view(), name='profile'),
    path('api/', BlogPostListAPI.as_view(), name='asad'),
    path('api/<int:pk>', BlogPostListAPIDetail.as_view()),
]
从django.url导入路径,包括
从.views导入注册表单、用户配置文件
从.api.views导入*
URL模式=[
路径('signup/',SignUpForm.as_view(),name='signup'),
路径('profile/',UserProfiles.as_view(),name='profile'),
路径('api/',BlogPostListAPI.as_view(),name='asad'),
路径('api/',BlogPostListAPIDetail.as_view()),
]
这是屏幕截图

正如@MaNKuR在对该问题的评论中指出的,在
元字段的末尾,序列化程序定义中还有一个逗号:

class BlogPostSerializer(serializers.ModelSerializer):

    class Meta:
        fields=(
            'author',
            'blog_title',
            'blog_description',
        ),
因此,
Meta.fields
现在是一个“字符串元组的元组”,而不仅仅是一个“字符串元组”

当迭代
字段时
,而不是预期的三个字符串元素

1. 'author'
2. 'blog_title'
3. 'blog_description'
只有一个元素不是字符串

1. ('author', 'blog_title', 'blog_description')

因此,序列化程序的内部代码抱怨它没有得到它应该得到的字符串。

看不到在哪里使用
hasttr
所有代码共享。但是我不知道怎么才能得到这个错误。另外,我没有使用hasttr。单击
开关复制并粘贴视图
,并将该错误粘贴到更新的错误中。应该列出它崩溃的地方。在
BlogPostSerializer
中删除模型前面的逗号“,”你说得对,MaNKuR