如何将模型类数据序列化为json

时间:2014-02-13 09:33:11

标签: python json django django-models

我想在我的django应用程序中添加一个视图,以便显示表Barati中的数据。

view.py

from django.http.response import Http404, HttpResponse
from django.template.response import TemplateResponse

from trello.models import Sveti, Barati


def get_index(request):
   return TemplateResponse(request,'index.html')

def get_settings(request):
    if not request.is_ajax():
       raise Http404
    svetebi = Sveti.objects.all()
    res = '['
    for sveti in svetebi:
        res = res + '{"name": ' + sveti.name + ', "position": ' + str(sveti.position) + ', "cards": null},'
    res = res[:-1]
    res = res + ']'
    return HttpResponse(res)

    def add_sveti(request):
    if not request.is_ajax():
        raise Http404
    sveti = Sveti()
    sveti.name = request.GET['name']
    sveti.position = request.GET['position']
    sveti.save()
    return HttpResponse('{"success":true}')

def add_barati(request):
    if not request.is_ajax():
       raise Http404
    barati = Barati()
    barati.text = request.GET['text']
    barati.position = request.GET['position']
    barati.sveti_id = request.GET['sveti_id']
    barati.save()
    return HttpResponse('{"success":true}')

models.py

 from django.db import models


 class Sveti(models.Model):
     name = models.CharField(max_length = 50, default = 'sveti')
     position = models.IntegerField()

 class Barati(models.Model):
     sveti = models.ForeignKey(Sveti)
     text = models.CharField(max_length = 10000)
     position = models.IntegerField()

我想将有关 Barati类(来自models.py)的信息添加到json格式的res中。但是我不能从这一点走得更远

4 个答案:

答案 0 :(得分:1)

你做错了。 Python附带json module

import json

dat = Sveti.objects.values("name", "position")
json_data = json.dumps(dat)

Sveti.objects.values创建包含所选字段的数据字典列表,然后您可以使用dumps将其序列化为json 或者如果要序列化所有值,可以使用django serializers

from django.core import serializers
json_data = serializers.serialize("json", Sveti.objects.all())

您可以使用这些方法序列化所需的Queryset。

如果要在同一json数据中组合这些数据,可以使用

json_data["sevni"] = serializers.serialize("json", Sveti.objects.all())
json_data["barati"] = serializers.serialize("json", Barati.objects.all())

>> print json_data

>> {"sveni": [{"id"............}, {.......}],
    "barati": [{"id"............}, {.......}] }

答案 1 :(得分:0)

根据这个django documantation ==> https://docs.djangoproject.com/en/1.6/topics/serialization/

#select all or use some filter, no matter
barati_json = serializers.serialize("json", Barati.objects.all()) 

并返回return_json。这就是全部..

//编辑:使用dict来汇总json内容:

import json
return_dict = {
    'barati': barati_json,
    'some_other_integer_param1': 1,
    'some_other_param':"blabla"
}
json.dumps(return_dict)

答案 2 :(得分:0)

您正在手动构建JSON字符串,这是不寻常的,也是不必要的。我建议使用此代码返回JSON中两个模型的所有实例:

import json

def get_settings(request):
    if not request.is_ajax():
       raise Http404
    sveti_all = list(Sveti.objects.all())
    barati_all = list(Barati.objects.all())
    return HttpResponse(serializers.serialize('json', sveti_all + barati_all))

答案 3 :(得分:0)

我最近不得不自己将一些数据序列化到json,这是我觉得有用的。

在models.py中:

class Person(models.Model):
      id = models.IntegerField(primary_key=True)
      name = models.CharField()
      address = models.CharField()
      extra1 = models.CharField()
      extra2 = models.CharField()

def as_my_person(self):
     return {
        "id":self.id,
        "name":self.name,
        "address":self.address

     }

在上面的例子中,我有一个有5个字段的模型,我只希望我的json数据有id,name和address。

在我的views.py中:

def person_view(request):
    data = Person.objects.filter(name__contains='john')
    dictionaries = [obj.as_my_person() for obj in data]
    serialized_data = simplejson.dumps(dictionaries)
    return HttpResponse(serialized_data, mimetype='application/json')

上面的代码应该返回一个名为'john'的所有人的json字符串。

[{ "id":1,"name":"john smith","address":"123 Main" }, { "id": 5, "name":"john doe", "address":"123 state" }]

我发现这是一种快速而简单的方法,可以将JSON数据格式化并返回到任何前端UI框架,如剑道。

希望它有所帮助。