【问题标题】:how to convert Django object into json?如何将 Django 对象转换为 json?
【发布时间】:2020-12-23 23:06:00
【问题描述】:

您好,我正在尝试将 Django 查询集对象转换为 JSON,但每次尝试使用 python JSON 模块执行此操作时,我都会收到此错误:“TypeError:QuerySet 类型的对象不是 JSON 可序列化的”。这是 Django 对象:titles = Queries.objects.values('Topic').distinct().,这是它返回的内容 `.

现在,即使我尝试使用 django 序列化程序来尝试解决此问题,我也会收到此错误:“AttributeError: 'dict' object has no attribute '_meta'。”谁能帮我解决这个问题?这是我在这两种情况下的代码。

django 序列化器情况的代码:

from django.shortcuts import render
from django.http import HttpResponse
from .models import Queries
import json
from django.core.serializers import json

from django.core import serializers

def data_json():
    titles = Queries.objects.values('Topic').distinct()
    titles_json = serializers.serialize('json', titles)
    with open('topic.json', 'w') as file:
        data = json.dumps(titles_json)
        print(data, file=file)
    print(titles)



def index(request, query_title):
    queries = Queries.objects.all()
    page = Queries.objects.filter(Topic=str(query_title))
    # print(page)
    data_json()
    return render(request, 'Querie/index.html', {'queries': page})

当我使用常规 json 模块时,我的代码看起来像这样,所以 data_json 函数是这样的:

import json

def data_json():
titles = Queries.objects.values('Topic').distinct()
with open('topic.json', 'w') as file:
    data = json.dumps(titles)
    print(data, file=file)

【问题讨论】:

  • 这能回答你的问题吗? Django Serializing of ValueQuerySet
  • 不,说实话,我不确定我是否理解所显示的答案要做什么。
  • 答案表明您不能序列化一个 ValueQuerySet (与您的情况相同),它是一个可迭代的包含 dict 对象,使用 Django 序列化器
  • 好吧,那我怎么把它转换成 JSON?
  • 你试过data = json.dumps(list(titles))吗?

标签: python json django django-models django-views


【解决方案1】:

对于您的 QuerySet 中的对象来说,它仍然是一个 QuerySet。我的猜测是:您不想序列化您的 QuerySet,而是序列化其中的内容和对象。也就是说:您需要解压缩 QuerySet 并对其中的每个对象应用序列化。

示例:

from django.contrib.auth.models import User
allUsers = User.objects.all() # QuerySet: allUsers
# apply your operation on each object in QuerySet (users) like this:
serializedData = [ json.dumps({'usrname': user.username, 
                  'mail': user.email}) for user in allUsers]

您的序列化数据集现在位于 serializedData 中。问题是,你想做这样的事情:

serializedData = [ json.dumps(user) for user in allUsers ]

但是对于 json.dumps() 和您的对象(在此示例中为 User 对象),没有免费午餐之类的东西。你有两个选择:

(1) 像上面的例子一样编码字典 {'usrname': user.username......}) 或

(2) 在用户对象“class UserEncoder(JSONEncoder):”的情况下,您需要定义一个“class ObjectClassNameEncoder(JSONEncoder):”,这更“复杂”。底线:您必须寻找的路径:JSONEncoder

【讨论】:

    猜你喜欢
    • 2011-09-29
    • 1970-01-01
    • 2017-07-29
    • 2023-03-17
    • 2017-06-16
    • 2021-11-23
    • 2016-12-31
    • 2011-03-13
    • 2016-12-26
    相关资源
    最近更新 更多