首页 > 编程问答 >Django 序列化程序无法将查询集序列化为 JSON

Django 序列化程序无法将查询集序列化为 JSON

时间:2024-07-24 09:00:10浏览次数:13  
标签:python json django django-serializer

尝试简单的 Django 序列化器。我使用具有特定值的 queryset 然后我将 queryset queryset.values() 传递给序列化器。为什么会出现500错误?

@csrf_protect
def geoLookup(request, **kwargs):
country = kwargs.get('Country')
city = kwargs.get('Place')
queryset = GeoNames_location.objects.filter(geoCountry_code=country, feature_class='P',     geoAsciiName__istartswith=city).values_list("geoAsciiName",  "geoLongitude", "geoLatitude",  "geo_timezone", "geo_population", "geoCountry_code").order_by('-geo_population')[:5]
data = serializers.serialize("json", queryset.values()) # tried queryset and     queryset.values()
parsed_data = json.loads(data)
pretty_json = json.dumps(parsed_data, indent=4)
return JsonResponse(json.loads(pretty_json), safe=False)


[24/Jul/2024 06:07:52] "GET /edit_chart_form HTTP/1.1" 200 18929
Internal Server Error: /geolookup/US/p
Traceback (most recent call last):
File "C:\Users\user\AppData\Local\Programs\Python\Python311\Lib\site-packages\django\core\handlers\exception.py", line 55, in inner
response = get_response(request)
           ^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\user\AppData\Local\Programs\Python\Python311\Lib\site-packages\django\core\handlers\base.py", line 197, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\user\AppData\Local\Programs\Python\Python311\Lib\site-packages\django\utils\decorators.py", line 188, in _view_wrapper
result = _process_exception(request, e)
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\user\AppData\Local\Programs\Python\Python311\Lib\site-packages\django\utils\decorators.py", line 186, in _view_wrapper
response = view_func(request, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "G:\My Drive\myProgram\runtime\devui\ui\views.py", line 81, in geoLookup
data = serializers.serialize("json", queryset.values())
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\user\AppData\Local\Programs\Python\Python311\Lib\site-packages\django\core\serializers\__init__.py", line 134, in serialize
s.serialize(queryset, **options)
File "C:\Users\user\AppData\Local\Programs\Python\Python311\Lib\site-packages\django\core\serializers\base.py", line 113, in serialize
concrete_model = obj._meta.concrete_model
                 ^^^^^^^^^
AttributeError: 'dict' object has no attribute '_meta'
[24/Jul/2024 06:07:55] "GET /geolookup/US/p HTTP/1.1" 500 105779

出现的错误是因为你尝试将 Django 序列化器用于列表字典,而 Django 序列化器是为 Django 模型实例设计的。 queryset.values() 返回一个列表字典,而不是 Django 模型实例的查询集。

以下是如何解决此问题的几种方法:

1. 使用 values 方法返回数据:

你不需要使用 serializers.serialize values 方法已经为你提供了一个字典列表,你可以直接将其传递给 JsonResponse

```python from django.http import JsonResponse

@csrf_protect def geoLookup(request, **kwargs): country = kwargs.get('Country') city = kwargs.get('Place') queryset = GeoNames_location.objects.filter( geoCountry_code=country, feature_class='P', geoAsciiName__istartswith=city ).values( "geoAsciiName", "geoLongitude", "geoLatitude", "geo_timezone", "geo_population", "geoCountry_code" ).order_by('-geo_population')[:5] return JsonResponse(list(queryset), safe=False) ```

2. 使用 Django REST framework:

如果你需要对序列化数据进行更多控制,或者计划构建 API,Django REST framework 是一个很好的选择。它提供了序列化器,可以轻松地将 Django 模型转换为 JSON。

```python from rest_framework import serializers from rest_framework.decorators import api_view from rest_framework.response import Response

from myapp.models import GeoNames_location

class GeoLocationSerializer(serializers.ModelSerializer): class Meta: model = GeoNames_location fields = ["geoAsciiName", "geoLongitude", "geoLatitude", "geo_timezone", "geo_population", "geoCountry_code"]

@api_view(['GET']) def geoLookup(request, **kwargs): country = kwargs.get('Country') city = kwargs.get('Place') queryset = GeoNames_location.objects.filter( geoCountry_code=country, feature_class='P', geoAsciiName__istartswith=city ).order_by('-geo_population')[:5] serializer = GeoLocationSerializer(queryset, many=True) return Response(serializer.data) ```

请注意,使用 Django REST framework 需要安装它 ( pip install djangorestframework ) 并将其添加到你的 INSTALLED_APPS 设置中。

这些方法都将返回你想要的 JSON 数据。选择最适合你需求和项目结构的方法。

标签:python,json,django,django-serializer
From: 78786054

相关文章

  • Python查找字符串的CRC32
    我尝试获取字符串数据类型变量的CRC32,但出现以下错误:>>>message='helloworld!'>>>importbinascii>>>binascii.crc32(message)Traceback(mostrecentcalllast):File"<stdin>",line1,in<module>TypeError:aby......
  • 使用python,如何创建重复的工作时间表
    这是我们公司的小组工作安排表。为三班制,2组日夜工作,1组休息。重复白天工作4天休息2天,然后再次夜间工作4天休息2天的时间表。我想使用python(pandas)自动安排在8月9日之后。抱歉英语不好,提前感谢您的帮助以下是使用Python和Pandas创建重复工作时间表的代码......
  • venv 已激活,但 pip 安装仍然默认进行,并且 python 在源代码中看不到该库
    在终端shell中的vscode中输入“whichpython”显示默认路径:C:\Users\erjan\AppData\Local\Programs\Python\Python311\python.exe(my_venv)但是(my_venv)意味着我的venv处于活动状态,我做了pipinstalltransformers,但下面的代码仍然显示错误-无法看到......
  • 在Python多处理中执行二进制信号量或互斥体以进行上下文切换操作
    我正在尝试自动化win应用程序和java应用程序之间的同步关系。我的标准是:启动win和jav应用程序在jav应用程序中执行命令等待jav应用程序的响应使用jav应用程序的响应到Windows应用程序作为输入。在jav应用程序中执行命令win应用程序......
  • 在spyder-python上随机出现的这些奇怪的亮点是什么
    在此处输入图像描述每次我单击此按钮或进行任何更改时,都会创建奇怪的突出显示,当我最小化功能时更是如此。有什么建议如何摆脱这些或可能的原因是什么?谢谢!我尝试更改外观首选项中的设置,但无法影响问题。很抱歉,我无法直接查看或与Spyder界面交互。我是一个AI......
  • 比较Python字典并找到缺失的元素
    我遇到了一个问题,我已经尝试了几天但没有得到任何结果。我想比较两个字典,在一个字典中有“赛前”足球比赛,在第二个字典中有“现场”足球比赛。我想将它们相互比较并打印它们(如果有)没有赛前比赛直播。示例1pre=[{"Home":"Genoa","Away":"In......
  • Python使用Visual Studio打印功能不显示输出
    任务:检查一个整数是正数还是负数。检查整数是否能被2整除。当输入0时,我需要退出循环并报告每个计数和总和。print函数没有显示任何输出。这是我从defmain()开始使用的代码defmain():countpositive=0countnegative=0count_divisible_by_2=0sump......
  • Python 中的像素最小二乘法
    我有一个非线性前向模型,它计算每个像素参数w的灰度图像。我还可以使用scipys优化函数来反转模型。我目前遇到的唯一问题是图像的大小使得这个解决方案非常慢...比如7%的像素在40分钟内计算得很慢。我使用for循环遍历所有像素并按像素应用模型。我尝试过......
  • SQL 命令在手动运行时工作正常(SQL Developer),但在 Python 的 oracledb 模块中给出 ORA-
    我正在使用OracleSQL数据库,并且我想运行该命令ALTERSESSIONSETNLS_DATE_FORMAT='YYYY-MM-DD';当我从SQLDeveloper应用程序手动运行它时,它工作正常。但是,当我使用oracledb模块从Python运行它时,出现以下错误:ErrorrunningSQLscript:ORA-00922:mi......
  • 在pip包中分发pythonnet dll类型信息
    我已经能够使用C#通过以下方式加载pythonnetdll:fromimportlib.resourcesimportpathimportsys#Assuming'my_package.lib'isthesub-packagecontainingtheDLLswithpath('pyrp.lib','')aslib_path:sys.path.append......