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

时间:2018-04-21 08:27:41

标签: python django python-3.x django-models django-rest-framework

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

  / user / api / hasattr()中的

TypeError:属性名称必须为字符串

     

异常类型:/ user / api /

中的TypeError      

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

这是我的 models.py 文件

else

这是我的 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})

这是 views.py 文件

from rest_framework import serializers

from blog.models import BlogPost


class BlogPostSerializer(serializers.ModelSerializer):

    class Meta:
        fields=(
            'author',
            'blog_title',
            'blog_description',
        ),
        model=BlogPost

这是 urls.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

这是屏幕截图 enter image description here

1 个答案:

答案 0 :(得分:2)

正如@MaNKuR在对该问题的评论中指出的那样,Meta.fields末尾的序列化定义中还有一个额外的逗号:

class BlogPostSerializer(serializers.ModelSerializer):

    class Meta:
        fields=(
            'author',
            'blog_title',
            'blog_description',
        ),

因此,Meta.fields现在是"字符串元组的元组"而不只是一个"字符串元组"。

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

1. 'author'
2. 'blog_title'
3. 'blog_description'

你只得到一个不是字符串的元素

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

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