我们知道Django Model QuerySet API有很多方法都是返回QuerySet对象。但很多时候我们都需要对QuerySet进行一个序列化操作,以便于提供给其他服务使用。
比如查询出模型对象所有记录:
1 2 3 |
>>> raw = Author.objects.all() >>> type(raw) <class 'django.db.models.query.QuerySet'> |
raw是一个QuerySet对象,我们对这个QuerySet迭代,使用__dict__属性得到一个字典:
1 2 |
>>> raw[0].__dict__ {'_state': <django.db.models.base.ModelState object at 0x10be2ada0>, 'id': 1, 'name': 'dkey', 'email': 'dkey@ywnds.com'} |
然后就可以对这个字典进行处理了。写一个方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
def Serialization(_obj: object) -> list: ''' _obj: objext -> list, Python 3.6新加入的特性, 用来标识这个方法接收一个对象并返回一个list orm.raw序列化 ''' _list = [] _get = [] for i in _obj: _list.append(i.__dict__) for i in _list: del i['_state'] _get.append(i) return _get |
使用方法:
1 2 |
>>> Serialization(raw) [{'id': 1, 'name': 'dkey', 'email': 'dkey@ywnds.com'}] |
可以看到就完成了序列化操作,字典、列表、元祖都可以。
同样,对于raw()方法也是一样的操作。
1 2 3 |
>>> raw = Author.objects.raw('select * from polls_author') >>> type(raw) <class 'django.db.models.query.RawQuerySet'> |
通过raw方法查询的结果是一个RawQuerySet对象,如果想取到所有的值可以这么做:
1 2 |
>>> raw[0].__dict__ {'_state': <django.db.models.base.ModelState object at 0x10868fe48>, 'id': 1, 'name': 'dkey', 'email': 'dkey@ywnds.com'} |
完结。。。