【问题标题】:In DRF(django-rest-framework), AttributeError 'str' object has no attribute '~~' How to solve it?在 DRF(django-rest-framework) 中,AttributeError 'str' object has no attribute '~~' 如何解决?
【发布时间】:2016-07-24 18:37:35
【问题描述】:

我正在使用 DRF 并且在 AttributeError 'str' 对象的前面没有属性 '~~'。

我的错误页面和代码

Environment:


Request Method: GET
Request URL: http://127.0.0.1:8000/blog/

Django Version: 1.9.7
Python Version: 3.5.2
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'django.contrib.gis',
 'blog',
 'account',
 'taggit',
 'friendship',
 'rest_framework']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']



Traceback:

File "/home/keepair/djangogirls/myvenv/lib/python3.5/site-packages/django/core/handlers/base.py" in get_response
  149.                     response = self.process_exception_by_middleware(e, request)

File "/home/keepair/djangogirls/myvenv/lib/python3.5/site-packages/django/core/handlers/base.py" in get_response
  147.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/home/keepair/djangogirls/myvenv/lib/python3.5/site-packages/django/views/decorators/csrf.py" in wrapped_view
  58.         return view_func(*args, **kwargs)

File "/home/keepair/djangogirls/myvenv/lib/python3.5/site-packages/django/views/generic/base.py" in view
  68.             return self.dispatch(request, *args, **kwargs)

File "/home/keepair/djangogirls/myvenv/lib/python3.5/site-packages/rest_framework/views.py" in dispatch
  466.             response = self.handle_exception(exc)

File "/home/keepair/djangogirls/myvenv/lib/python3.5/site-packages/rest_framework/views.py" in dispatch
  463.             response = handler(request, *args, **kwargs)

File "/home/keepair/djangogirls/myvenv/lib/python3.5/site-packages/rest_framework/decorators.py" in handler
  52.             return func(*args, **kwargs)

File "/home/keepair/djangogirls/blog/views.py" in post_list
  37.         return Response(serializer.data)

File "/home/keepair/djangogirls/myvenv/lib/python3.5/site-packages/rest_framework/serializers.py" in data
  700.         ret = super(ListSerializer, self).data

File "/home/keepair/djangogirls/myvenv/lib/python3.5/site-packages/rest_framework/serializers.py" in data
  239.                 self._data = self.to_representation(self.instance)

File "/home/keepair/djangogirls/myvenv/lib/python3.5/site-packages/rest_framework/serializers.py" in to_representation
  618.             self.child.to_representation(item) for item in iterable

File "/home/keepair/djangogirls/myvenv/lib/python3.5/site-packages/rest_framework/serializers.py" in <listcomp>
  618.             self.child.to_representation(item) for item in iterable

File "/home/keepair/djangogirls/myvenv/lib/python3.5/site-packages/rest_framework/serializers.py" in to_representation
  463.                 attribute = field.get_attribute(instance)

File "/home/keepair/djangogirls/myvenv/lib/python3.5/site-packages/rest_framework/relations.py" in get_attribute
  157.         return get_attribute(instance, self.source_attrs)

File "/home/keepair/djangogirls/myvenv/lib/python3.5/site-packages/rest_framework/fields.py" in get_attribute
  83.                 instance = getattr(instance, attr)

Exception Type: AttributeError at /blog/
Exception Value: 'str' object has no attribute 'author'

我想知道如何制作serializers.py 代码。

我已经研究过了:http://www.django-rest-framework.org/api-guide/relations/

但我不明白我应该做什么。我应该把serializers.py放在哪里? 以及如何使我的序列化程序代码?或者models.ForienKey 在使用 DRF 时不可用?

blog/views.py

@api_view(['GET'])
def post_list(request, format=None):
    """
    List all snippets, or create a new snippet.
    """
    if request.method == 'GET':
        lat = request.POST.get('user_lat', '13')
        lon = request.POST.get('user_lon', '15')
        userpoint = GEOSGeometry('POINT(' + lat + ' ' + lon + ')', srid=4326)
        i=1

        while i:
            list_i = Post.objects.filter(point__distance_lte = (userpoint, D(km=i)))
            list_total = str(',' + ' list_i')
            post_list = list(chain(list_total))
            if len(post_list) >= 0 :
                break

        serializer = PostSerializer(post_list, many=True)
        return Response(serializer.data)

【问题讨论】:

  • 您需要在 blog/views 中显示 post_list 功能。
  • 请不要在这里发布长行代码,因为这对我们来说是一项非常乏味的任务。你可以考虑通过这个link
  • @DanielRoseman ,添加了 blog/views.py 抱歉我不知道需要什么代码..
  • @Amal.R,对不起。我在编程方面非常陌生,所以我不知道必须有哪些代码有问题。我会记住你的建议,所以下次我会尝试提出好的问题和代码。谢谢

标签: python django django-rest-framework


【解决方案1】:

这与您的序列化程序或您放置它的位置无关。错误回溯告诉您错误发生在视图中。

因此,在您的 post_list 视图中,您构建了一个由字符串列表填充的列表(也称为post_list)。然后你尝试通过 PostSerializer,它当然需要一个 Posts 查询集。

我不确定列表的意义是什么;似乎您应该将帖子直接传递给序列化程序。

【讨论】:

  • 谢谢,但我必须使用我的自定义“post_list”。有没有办法让这个 post_list '序列化'?
  • 您到底想“序列化”什么?您的列表完全由一系列相同的字符串组成,它们都是", list_i"。有什么意义?
  • 首先,, list_i 会见 itertools 的语法 - 链(来自:docs.python.org/3.3/library/itertools.html)将我的列表汇总为一个列表。例如,来自 5 公里列表附近的 'userpoint' 的 post_list(+ 我的自定义选项,例如..作者的名字是巴士总站)和来自 10 公里列表附近的 'userpoint' 的 post_list .. 这样也许我想要总和 5-7仅列出一个列表。所以最后我想序列化最后一个列表(itertools的结果。)。对不起,我的英语表达很糟糕。我希望这足以让你理解我的想法。
  • 根据我上面的评论, post_list -> list_1, list_2 。我的意思是,list_1, list_2, + ... + list_(maybe)6 -> 最后一个列表(作为我的代码,= post_list),而这个 post_list 是我想要序列化的。其实我想做android应用,我需要restful api。
猜你喜欢
  • 1970-01-01
  • 2020-04-26
  • 2020-12-29
  • 1970-01-01
  • 2021-04-06
  • 2022-12-04
  • 2022-11-11
  • 1970-01-01
  • 2019-12-20
相关资源
最近更新 更多