奥门威尼斯网址:Django重回json数据用法示例,django重临json示例

by admin on 2019年9月2日

Django返回json数据用法示例,django返回json示例

本文实例讲述了Django返回json数据用法。分享给大家供大家参考,具体如下:

1、前端。jQuery发送GET请求,并解析json数据。getJSON方法可参考这里。

url = "http://example/?question=" + question + "&rand=" + Math.random();
$.getJSON(url, function(json){
  answer = json.answer;
  alert(answer);
});

2、后端。Django接收GET请求并返回json数据。

from django.http import HttpResponse
from django.utils import simplejson
if request.method == 'GET' and 'question' in request.GET:
  question = request.GET['question']
  print(question)
  data = {"answer": "answer"}
  #ensure_ascii=False用于处理中文
  return HttpResponse(simplejson.dumps(data, ensure_ascii=False))

更多关于Python相关内容感兴趣的读者可查看本站专题:《Python图片操作技巧总结》、《Python数据结构与算法教程》、《Python
Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

本文实例讲述了Django返回json数据用法。分享给大家供大家参考,具体如下:
1、前端。jQuery发…

返回的格式需要是json数据格式的时候,将content 格式为json对象即可:

Django开发中复选框用法示例,django示例

本文实例讲述了Django开发中复选框用法。分享给大家供大家参考,具体如下:

一、查询数据库遍历所有的复选框

1、python查询数据库所有的tag

# 新增文章
def add(request):
  if request.method == 'GET':
    tags = TagModel.objects.all()
    return render(request, 'books_add.html', {'tags': tags})
  elif request.method == 'POST':
    title = request.POST.get('title', None)
    content = request.POST.get('content', None)
    blogModel = BlogModel(title=title, content=content, author=AuthorModel.objects.get(id=1))
    blogModel.save()
    # 获取复选框的值,是一个选中的数组
    tags = request.POST.getlist('tags')
    # 循环遍历所有选中的复选框,利用多对多的关系追加到数据库
    for tag in tags:
      blogModel.tag.add(tag)
    return HttpResponseRedirect('book_add')
  else:
    return HttpResponse(u'是不被处理的请求方式')

2、前端页面

<div class="form-group">
  <label class="col-sm-2 control-label">标签</label>
  <div class="col-sm-9">
    {% for tag in tags %}
      <label class="checkbox-inline">
        <input value="{{ tag.id }}" type="checkbox" name="tags"/>{{ tag.name }}
      </label>
    {% endfor %}
  </div>
</div>

3、进入编辑页面,先获取全部的复选框及选中的id

# 编辑博客
def edit(request, blog_id):
  tags = TagModel.objects.all()
  # 利用正向查找关于本博客选择的tag
  blogModel = BlogModel.objects.filter(id=blog_id).first()
  # 获取全部的tag
  check_tag = blogModel.tag.all()
  # 获取选中的id
  check_id = [int(x.id) for x in check_tag]
  print check_id
  return render(request, 'books_edit.html', {'tags': tags, 'check_id': check_id})

4、判断如果选中的就勾选

<div class="form-group">
  <label class="col-sm-2 control-label">标签</label>
  <div class="col-sm-9">
    {% for tag in tags %}
      {% if tag.id in check_id %}
        <label class="checkbox-inline">
          <input value="{{ tag.id }}" type="checkbox" name="tags" checked="checked"/>{{ tag.name }}
        </label>
      {% else %}
        <label class="checkbox-inline">
          <input value="{{ tag.id }}" type="checkbox" name="tags"/>{{ tag.name }}
        </label>
      {% endif %}
    {% endfor %}
  </div>
</div>

二、ajax提交的时候注意要把复选框转换字符串提交

1、前端代码

$('#btn').on('click', function (e) {
  // 设置空数组
  var hobby = [];
  $('#hobby-group').find('input[type=checkbox]').each(function () {
 if ($(this).prop("checked")) {
   var hobbyId = $(this).val();
   hobby.push(hobbyId);
 }
  })
  console.log(hobby);
  $.ajax({
 'url': '/ajaxpost/',
 'method': 'post',
 'data': {
   'username': $('.username').val(),
   'hobby': hobby
 },
 'traditional': true,
 'beforeSend': function (xhr, settings) {
   var csrftoken = ajaxpost.getCookie('csrftoken');
   //2.在header当中设置csrf_token的值
   xhr.setRequestHeader('X-CSRFToken', csrftoken);
 },
 'success': function (data) {
   console.log(data);
 }
  })
})

2、后端代码

@require_http_methods(['POST'])
def ajaxpost(request):
  form = LoginForm(request.POST)
  if form.is_valid():
    username = form.cleaned_data.get('username', None)
    # 获取复选框的值
    hobby = request.POST.getlist('hobby')
    print '*' * 100
    print hobby
    print '*' * 100
    return HttpResponse(u'成功')
  else:
    return HttpResponse(u'验证错误')

希望本文所述对大家Django框架的Python程序设计有所帮助。

本文实例讲述了Django开发中复选框用法。分享给大家供大家参考,具体如下:
一、查询数据库遍历…

前端发送请求与接收数据:

一、引子

from django.http import HttpResponse

import json

def test(request):

    resp = {
        'code': '200',
        'message': 'success',
        'data': {
            'num': '1234',
        },
    }

    response = HttpResponse(content=json.dumps(resp), content_type='application/json;charset = utf-8',
    status='200',
    reason='success',
    charset='utf-8')

    return response

$.ajax({
        type : “post”,
        url : “/queryStudent”,
        dataType : “JSON”,
        async : false,
        contentType : “application/x-www-form-urlencoded;
charset=utf-8”,
        success : function(data) {
            data = eval(“(” + data + “)”);
            var jhtml = “”;
            if (data.List.length > 0) {
                var yHtml = “”;
                for ( var i = 0; i < data.List.length; i++) {
                    yHtml += “<div><a class=\”” + (i + 1) +
“\”>” + data.List[i].name + “</a></div>”;
                }
                $(“#info”).append(yHtml);
            }
        }
    });

Django 分页查询并返回 json ,需要将返回的 queryset 序列化, demo 如下:

奥门威尼斯网址 1

type:异步发送

# coding=UTF-8

import os

from django.core import serializers
from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage
from django.shortcuts import render
from django.http import HttpResponse
from mypage.models import Product


# Create your views here.


def getAllProducts(request):
  products_list = Product.objects.all()
  paginator = Paginator(products_list, 10) # Show 10 products per page
  page = request.GET.get('page', 0)
  try:
    products = paginator.page(page)
  except PageNotAnInteger:
    # If page is not an integer, deliver first page.
    products = paginator.page(10)
  except EmptyPage:
    # If page is out of range (e.g. 9999), deliver last page of results.
    products = paginator.page(paginator.num_pages)

  json_data = serializers.serialize("json", products, ensure_ascii=False)
  return HttpResponse(json_data, content_type='application/json; charset=utf-8')

image.png

url:请求地址,这里是通过web.xml中的servlet来识别,然后进入指定的servlet

很容易出现的一个错误是中文乱码,重点在于 json_data = serializers.serialize("json", products, ensure_ascii=False)中第三个参数。

dataType: 数据类型为json(另一种经常用的为xml)

二、Serialize—-序列化django对象

contentType:请求头,告诉服务器这是表单提交

官方文档原文:

success :
function(data):表示请求发送成功后执行的方法,data为返回的json数据

django的序列化框架提供了一个把django对象转换成其他格式的机制,通常这些其他的格式都是基于文本的并且用于通过一个管道发送django对象,但一个序列器是可能处理任何一个格式的(基于文本或者不是)

 

django的序列化类位于django.core下面的serializers文件夹里面,base.py文件里面定义了序列器和反序列器的基类以及一些异常,
init .py文件定义了如何根据格式来选择对应的序列器等内容,我们一起来看看吧

服务器端接收参数、查询数据、处理业务等,并且返回一条json格式的字符串:

init.py和base.py文件的函数原型如下图

在servlet中的doPost方法中写处理过程

def serialize(format, queryset, **options):
"""Serialize a queryset (or any iterator that returns database objects) using
a certain serializer."""
s = get_serializer(format)()
s.serialize(queryset, **options)
return s.getvalue()


class Serializer(object):
  """  Abstract serializer base class.  """
  # Indicates if the implemented serializer is only available for
  # internal Django use.
  internal_use_only = False
  def serialize(self, queryset, **options):

List list ;

那下面我们开始正式讲解django的序列化操作了

将处理好的数据放在对象list中,

序列化数据

JSONArray listjson = JSONArray.fromObject(list);定义json数组对象

在最高层的api,序列化数据是非常容易的操作,看上面的函数可知,serialize函数接受一个格式和queryset,返回序列化后的数据:

String result = “{ \”Count\”:” + count + “,\”List\”:” +
listjson.toString() + “}”;

简单的写法:

json数据在以上可以自主添加需要的数据,返回到前端时,用data.Count可以获得数据count;用data.List获得listjson.toString()

from django.core import serializers
data = serializers.serialize("xml", SomeModel.objects.all())

最后加上:

复杂的写法:

    response.setCharacterEncoding(“UTF-8”);
        response.setContentType(“text/javascript”);
        PrintWriter out = response.getWriter();
        out.print(result.toString());
        out.flush();
        out.close();

XMLSerializer = serializers.get_serializer("xml")
xml_serializer = XMLSerializer()
xml_serializer.serialize(queryset)
data = xml_serializer.getvalue()

反序列化数据

一样的简单,接受一个格式和一个数据流,返回一个迭代器

for obj in serializers.deserialize("xml", data):
  do_something_with(obj)

然而,deserialize返回的的是不是简单的django类型对象,而是DeserializedObject实例,并且这些实例是没有保存的,请使用DeserializedObject.save()方法把这些数据保存到数据库

序列化格式

django之处很多的序列化格式,有些需要你安装第三方支持的模块,xml,json和yaml是默认支持的

注意事项

如果你是使用utf-8或者其他的非ascii编码数据,然后用json序列器,注意穿一个ensure_ascii参数进去,否则输出的编码将会不正常

json_serializer = serializers.get_serializer("json")()
json_serializer.serialize(queryset, ensure_ascii=False, stream=response)

序列化参数

序列化的是是可以接受额外的参数的,总共有三个参数,如下:

self.stream = options.pop("stream", StringIO())
    self.selected_fields = options.pop("fields", None)
    self.use_natural_keys = options.pop("use_natural_keys", False)

stream

将序列化后的数据输出到该stream流中,接上面的复杂的写法:

out = open("file.xml", "w")
xml_serializer.serialize(SomeModel.objects.all(), stream=out)

selected_field

选择序列化的属性,通过制定fields参数,fields是一个元组参数,元素是选择要序列化的属性

from django.core import serializers
data = serializers.serialize('xml', SomeModel.objects.all(), fields=('name','size'))

use_natural_keys

是否使用自然的关键字,默认是false(即是使用主键)

默认的外键和多对多关系序列化策略是使用主键,一般情况下是很好地,但有些情况下就不是这样了。比如外键到ContentType的时候,由于ContentType是django的数据库进程同步的时候自动产生的,它们的关键字不是那么容易去预测的。

一个整数id也不总是最方便的索引到一个对象的方法,所以基于这些情况,django提供了use_natural_keys这个参数,

一个natural
key是一个可以不使用主键就可以用来区分一个元素的属性组合的元组

natural keys的反序列化

考虑这两个模型

from django.db import models
class Person(models.Model):
  first_name = models.CharField(max_length=100)
  last_name = models.CharField(max_length=100)
  birthdate = models.DateField()
  class Meta:
    unique_together = (('first_name', 'last_name'),)
class Book(models.Model):
  name = models.CharField(max_length=100)
  author = models.ForeignKey(Person)

默认Book
的序列化数据将会使用一个整数索引到一个作者,例如,用json的是,一个Book的序列化数据大概是这样的,42是外键Author的主键

{
  "pk": 1,
  "model": "store.book",
  "fields": {
    "name": "Mostly Harmless",
    "author": 42
  }
}

但这不是一个很好的方法,不是吗?你需要知道这个主键代表到底是哪个Author,并且要求这个主键是稳定和可预测的。所以,我们可以增加一个natural
key的处理函数,请在对应模型的管理模型里面定义一个get_by_natural_key方法,例如:

from django.db import models
class PersonManager(models.Manager):
  def get_by_natural_key(self, first_name, last_name):
    return self.get(first_name=first_name, last_name=last_name)
class Person(models.Model):
  objects = PersonManager()
  first_name = models.CharField(max_length=100)
  last_name = models.CharField(max_length=100)
  birthdate = models.DateField()
  class Meta:
    unique_together = (('first_name', 'last_name'),)

这样之后,序列化的结果大概是这样的:

{
  "pk": 1,
  "model": "store.book",
  "fields": {
    "name": "Mostly Harmless",
    "author": ["Douglas", "Adams"]
  }
}

natural keys的序列化

如果你想在序列化的时候使用natural
key,那你必须在被序列化的模型里面顶一个natural_key方法,并在序列化的时候使用use_natural_keys=True属性如下:

class Person(models.Model):
  objects = PersonManager()
  first_name = models.CharField(max_length=100)
  last_name = models.CharField(max_length=100)
  birthdate = models.DateField()
  def natural_key(self):
    return (self.first_name, self.last_name)
  class Meta:
    unique_together = (('first_name', 'last_name'),)

serializers.serialize('json', [book1, book2], use_natural_keys=True)

注意:natural_key()和get_by_natural_key()不是同时定义的,如果你只想重载natural
keys的能力,那么你不必定义natural_key()方法;同样,如果你只想在序列化的时候输出这些natural
keys,那么你不必定义get_by_natural_key()方法

序列化过程中的依赖关系

因为natural
keys依赖数据库查询来解析引用,所以在数据被引用之前必须确保数据是存在的。看下面的例子,如果一个Book的natural
key是书名和作者的组合,你可以这样写:

class Book(models.Model):
  name = models.CharField(max_length=100)
  author = models.ForeignKey(Person)

  def natural_key(self):
    return (self.name,) + self.author.natural_key()

那么问题来了,如果Author还没有被序列化呢?很明显,Author应该在Book之前被序列化,为此,我们可以添加一个依赖关系如下:

def natural_key(self):
  return (self.name,) + self.author.natural_key()
natural_key.dependencies = ['example_app.person']

这保证了Person对象是在Book对象之前被序列化的,同样,任何一个引用Book的对象只有在Person和Book对象都被序列化之后才会被序列化

继承的模型

如果是使用抽象继承的时候,不必在意这个问题;如果你使用的是多表继承,那么注意了:必须序列化所有的基类,例如:

class Place(models.Model):
  name = models.CharField(max_length=50)
class Restaurant(Place):
  serves_hot_dogs = models.BooleanField()

如果仅仅序列化Restaurant模型,那么只会得到一个serves_hot_dog属性,基类的属性将被忽略,你必须同时序列化所有的继承的模型,如下:

all_objects = list(Restaurant.objects.all()) + list(Place.objects.all())
data = serializers.serialize('xml', all_objects)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

您可能感兴趣的文章:

  • Django实现分页功能
  • django
    js实现部分页面刷新的示例代码
  • Django实现简单分页功能的方法详解
  • Django的分页器实例(paginator)
  • django之session与分页(实例讲解)
  • Django实现快速分页的方法实例
  • 在django中使用自定义标签实现分页功能
  • Django自定义分页效果
  • Django自定义分页与bootstrap分页结合
  • django实现分页的方法

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图