相信使用Python做Web开发的朋友都会遇到这样1个问题,那就是在项目开发中使用模型框架,比如SQLAlchemy、Peewee,我们在做RESTful接口时如何将这些模型序列化为JSON数据。
关于这个问题,跟隔壁那位搞Python的哥们有关系。我不得不佩服这位哥们竟然自己写了1套ORM框架,而且用起来的那么遛,不得不让我汗颜。
但是,在给前端提供接口的时候,如何序列化为JSON数据确实困扰了我们那么一阵子,毕竟占据我们很大一部分时间来进行序列化操作。
这里,我们使用peewee来定义1个简单的例子来说明:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
from peewee import SqliteDatabase from peewee import Model, CharField, DateField, BooleanField, ForeignKeyField db = SqliteDatabase('dev.sqlite3') class BaseModel(Model): class Meta: database = db class Person(BaseModel): name = CharField(max_length= 20) birthday = DateField() sex = BooleanField() class Pet(BaseModel): owner = ForeignKeyField(Person, related_name= 'pets') name = CharField(max_length= 10) animal_type = CharField(max_length= 20) |
在这里我们定义了Person和Pet这2个模型,每个Person可能有1个Pet的宠物。
我们插入一些数据,现在假设我们现在有如下的数据:
1 2 3 4 5 6 7 8 9 10 |
sqlite> select * from person; 1|Bob|1960-01-15|1 2|Grandma|1935-03-01|0 3|Herb|1950-05-05|1 sqlite> select * from pet; 1|1|Kitty|cat 2|3|Fido|dog 3|3|Mittens|cat 4|2|Jack|cat |
现在,我们假设我们接口需要返回的接口是每个用户的名称、生日及其对应的宠物的信息。
我们可以通过连表的方式轻松的获取到我们需要的数据:
1 |
query=Person.select(Person,Pet).join(Pet) |
那么我们怎么将这个模型数据转换为我们需要的JSON数据呢?一般情况下,我们会这样操作:
1 2 3 4 5 6 7 8 9 10 11 12 |
data = [] for person in query.aggregate_rows(): d={} d['username'] = person.name d['birthday'] = person.birthday d['pet'] = [] for pet in person.pets: o = {} o['name'] = pet.name o['animal_type'] = pet.animal_type d['pet'].append(o) data.append(d) |
最后我们将得到如下的结果:
1 2 3 4 5 6 7 8 9 10 11 |
[{'birthday': datetime.date(1960, 1, 15), 'pet': [{'animal_type' 'pet': [{'animal_type' 这里,我们使用peewee来定义1个简单的例子来说明:
在这里我们定义了Person和Pet这2个模型,每个Person可能有1个Pet的宠物。
现在,我们假设我们接口需要返回的接口是每个用户的名称、生日及其对应的宠物的信息。
那么我们怎么将这个模型数据转换为我们需要的JSON数据呢?一般情况下,我们会这样操作:
最后我们将得到如下的结果:
|