序列化问题

  1. 对于ajax来说,只能接收字符串,那么我们在后台的关键问题是,如何才能将我们要传入的数据序列化,使之成为ajax可以接收的数据类型呢?json模块是一个序列化的办法,然而json只能序列化python的三大数据类型,元组,列表,字典,对于其他的数据类型,json并不能为我们序列化,那么我们应该怎么办呢?

针对form组件来说,无非就是向后端传入2种数据,form类和error信息,form类不必多说,然而error信息是一个对象,并不属于三大数据类型,那么我们能否用json进行序列化,向后端发送呢?答案是可以的,因为obj.errors在django中已经为我们设置好了几种转换形式。

我们打印obj.errors的类型可以得到如下结果

<class 'django.forms.utils.ErrorDict'>

我们追溯这个ErrorDict这个类,

class ErrorDict(dict):

我们可以看到,这个类是继承于dict的(也就是字典),所以说,我们的obj.errors本质上也是一个字典类型,再往下看:

    def as_data(self):
        return {f: e.as_data() for f, e in self.items()}

    def get_json_data(self, escape_html=False):
        return {f: e.get_json_data(escape_html) for f, e in self.items()}

    def as_json(self, escape_html=False):
        return json.dumps(self.get_json_data(escape_html))

    def as_ul(self):
        if not self:
            return ''
        return format_html(
            '<ul class="errorlist">{}</ul>',
            format_html_join('', '<li>{}{}</li>', self.items())
        )

    def as_text(self):
        output = []
        for field, errors in self.items():
            output.append('* %s' % field)
            output.append('\n'.join('  * %s' % e for e in errors))
        return '\n'.join(output)

    def __str__(self):
        return self.as_ul()

在源码中,这个类会自动给我们进行转换,将这个error当作其他类型进行reuturn,在__str__方法中,默认给我们返回的是作为<ul>标签进行返回的,这就解释了,为什么之前我们在前端页面中调用{{ obj.errors }}时,返回的是一串<ul>标签。所以我们可以直接用json序列化我们这个obj.errors。

2.django内置了一个模块,可以序列化queryset对象,我们用json模块并不能直接序列化QuerySet对象,这时候就要用到这个模块了。

from django.core import serializers

用到下面这个方法:

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()

我们需要传入需要序列化的数据类型,还有对象:

res = serializers.serialize('json',queryset)

这样就可以转换为json对象了

  1. 当然如果不知道这个模块,还有一个简单的办法进行序列化,我们可以直接将QuerySet对象转化那位列表:
list(QuerySet)

然后用json.dumps序列化这个列表,发送给前端之后,效果和上面的时一样的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值