【问题标题】:Django rest api issue: hasattr(): attribute name must be stringDjango rest api问题:hasattr():属性名必须是字符串
【发布时间】:2018-04-21 08:27:40
【问题描述】:

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

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

异常类型:/user/api/ 处的 TypeError

异常值: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})

这是我的 serializers.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

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

这是 urls.py 文件

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()),
]

这是截图

【问题讨论】:

  • 看不到hasttr的使用位置
  • 所有代码共享。但我不知道我怎么能得到这个错误。另外,我没有使用 hasttr
  • 单击switch to copy and paste view 并将该错误粘贴到更新的错误中。应该可能会列出它崩溃的地方。
  • 删除BlogPostSerializer中模型前的逗号','
  • 你是对的,MaNKuR

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


【解决方案1】:

正如@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')

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    • 2012-01-31
    相关资源
    最近更新 更多