月度归档:2021年02月

Django admin export inline sub models

Django 导入导出大部分情况都可以使用django-import-export扩展,但是实际业务中经常需要导出子模型数据,比如导出订单同时需要导出订单商品信息。django-import-export扩展默认不支持导出inline子模型,这时候需要自己实现resource的export方法:

自定义django-import-export的export方法

class OrderResource(resources.ModelResource):
    class Meta:
        model = Order

    def export(self, queryset=None, *args, **kwargs):
        if queryset is None:
            queryset = self.get_queryset()
        ds = tablib.Dataset()
        data = []
        for order in queryset:
            for item in order.items.all():
                row = {
                    'order_id': order.id,
                    "item_id": item.idd,
                }
                data.append(row)
        ds.dict = data
        return ds

参考

JSON、BSON及Protocol Buffer比较

他们核心区别在于,bson在json基础上增加了数据日期、文档类型,并支持二进制传输;而protocol buffer则对传输数据和结构定义进行了分离。一般来说与浏览器通信通常使用json,如果需要跨语言通信,且考虑效率,则可以采用protocol buffer。

JSON

特点:

文本存储和传输,结构与数据一体,肉眼可识别

优点:

  1. 通用性好,各种语言都支持;
  2. 可用于存储

缺点:

  1. 采用文本传输,占用体积大,传输性能差
  2. 序列化,反序列化性能较差
  3. 不支持二进制,日期等数据类型

Bson

特点:

采用二进制传输,结构与数据一体

优点:

  1. 在json基础上增加二进制和日期等格式;
  2. 传输性能较好
  3. 序列化,反序列化性能较好

缺点:

  1. 多语言支持一般
  2. 传输数据与结构定义仍然在一体

Protocol Buffer

特点:

结构定义与传输数据分离,只传输二进制数据

优点:

  • 用protoc工具可以根据proto文件生成各种语言对应代码
  • 字段被编号,新添加的字段不影响老结构,解决了向后兼容问题。
  • 二进制无结构消息,效率高,性能高。

缺点:

  • 二进制格式,可读性差(抓包dump后的数据很难看懂)
  • 默认不具备动态特性