【问题标题】:Return json response instead of list of Django models返回 json 响应而不是 Django 模型列表
【发布时间】:2019-08-22 15:10:12
【问题描述】:

我是 python 和 Django 的新手,这是我的第一个项目。我遵循了一个返回对象列表的教程。我想返回 json。

我已经尝试过 JsonResponse、json.dump 但我认为我没有正确实施这些

class ListVenuesView(generics.ListAPIView):

    serializer_class = VenueSerialiser

    def get_queryset(self):
        queryset = (Venue.objects.all())
        location = self.request.query_params.get('location', None)
        latitude = location.split('S')[0]
        longitude = location.split('S')[1]
        venue_gaps = {}
        for venue in queryset.iterator():
            locationArray = [y.strip() for y in venue.postcode.split(',')]
            distance = gmaps.distance_matrix([str(latitude) + " " + str(longitude)], [str(locationArray[0]) + " " + str(locationArray[1])], mode='driving')['rows'][0]['elements'][0]
            m = distance["distance"]["value"]
            venue_gaps[m] = model_to_dict(venue)
        sorted_venues = dict(sorted(venue_gaps.items()))
        #print(sorted_venues)
        jsonResponse = json.dumps(venue_gaps, sort_keys=True)
        print(jsonResponse)

        return JsonResponse({'data':jsonResponse}, safe=False)

这当前抛出

Got AttributeError when attempting to get a value for field `name` on serializer `VenueSerialiser`.

如果我用

替换返回行
return Venue.objects.all()

我得到一个 200 但我需要它在 json 中

class VenueSerialiser(serializers.ModelSerializer):
    class Meta:
        model = Venue
        fields = ('name', 'location', 'capacity', 'photo_url', 'accomodation', 'cost', 'description', 'postcode', 'email', 'website')

【问题讨论】:

  • 你为什么在 get_queryset() 方法中返回一个 JsonResponse ???看来您使用的不是普通的 Django,而是 django-rest-framework (ListAPIView),它已经返回 JSON。 get_queryset() 方法应该返回一个查询集(或列表)。
  • 哦,好吧,对不起,我只是在学习一个教程。我需要创建一个单独的函数来返回 json 吗?
  • 您的视图已经返回 json。你不需要做任何事情。如果您在浏览器中键入视图的 url,您会看到响应 is json.
  • 当我运行上面的代码时,我得到了错误 - “AttributeError at /api/v1/venues/ Got AttributeError when trying to get a value for field name on serializer VenueSerialiser. 序列化程序字段可能命名不正确,并且与 bytes 实例上的任何属性或键都不匹配。原始异常文本为:'bytes' 对象没有属性 'name'。"
  • 我也添加了我的序列化程序类

标签: python json django django-models


【解决方案1】:

感谢 Daniel Roseman 和 dirkgroten,我将 get_queryset 更改为 get 并返回了 json。感谢您的帮助:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 2021-10-18
    • 2021-10-19
    • 2019-01-18
    • 2016-07-03
    • 2017-10-12
    相关资源
    最近更新 更多