序列化程序在Javascript

时间:2019-05-22 14:02:06

标签: python django

我需要从Django Queryset生成一个非常干净的JS数组结构。为此,我使用了序列化器。

  

但是,它们的最终数组具有可能导致问题的额外字段   使用Google Analytics(分析)请求的格式。

Google Analytics(分析)要求的格式:

  

注意products数组的结构

<script>
// Send transaction data with a pageview if available
// when the page loads. Otherwise, use an event when the transaction
// data becomes available.
dataLayer.push({
  'ecommerce': {
    'purchase': {
      'actionField': {
        'id': 'T12345',                         // Transaction ID. Required for purchases and refunds.
        'affiliation': 'Online Store',
        'revenue': '35.43',                     // Total transaction value (incl. tax and shipping)
        'tax':'4.90',
        'shipping': '5.99',
        'coupon': 'SUMMER_SALE'
      },
      'products': [{                            // List of productFieldObjects.
        'name': 'Triblend Android T-Shirt',     // Name or ID is required.
        'id': '12345',
        'price': '15.25',
        'brand': 'Google',
        'category': 'Apparel',
        'variant': 'Gray',
        'quantity': 1,
        'coupon': ''                            // Optional fields may be omitted or set to empty string.
       },
       {
        'name': 'Donut Friday Scented T-Shirt',
        'id': '67890',
        'price': '33.75',
        'brand': 'Google',
        'category': 'Apparel',
        'variant': 'Black',
        'quantity': 1
       }]
    }
  }
});
</script>

由序列化程序生成的dataLayer product数组:

enter image description here

包含序列化程序的视图:

def thanks_deposit_payment(request):
    order_number = Order.objects.latest('id').id

    total = Order.objects.latest('id').total

    costo_despacho = Order.objects.latest('id').shipping_cost

    order_items = OrderItem.objects.filter(order=Order.objects.latest('id'))


    order_items = serialize('json', order_items, fields=['id', 'sku', 'name', 'price', 'size', 'quantity'])


    response = render(request, 'thanks_deposit_payment.html', dict(order_number=order_number, total=total,
                                                                   order_items=order_items, costo_despacho=costo_despacho))
    return response
模板中的

dataLayer:

这是产生需要更改的产品数组的行:

 products: JSON.parse('{{ order_items | safe }}')

在模板中完成JS代码:

{% block data_layer %}

<script>
    window.dataLayer = window.dataLayer || [];
    window.dataLayer.push({
        event: 'eec.purchase',
        ecommerce: {
            currencyCode: 'PEN',
            purchase: {
                actionField: {
                    id: {{ order_number }},
                    affiliation: 'Stickers Gallito E-Commerce',
                    revenue: {{ total }},
                    shipping: {{ costo_despacho }},
                    coupon: ''
                },
                products: JSON.parse('{{ order_items | safe }}')
            },

        }
    });
</script>

{% endblock %}

我如何匹配Google的预期格式?

1 个答案:

答案 0 :(得分:1)

您尚未指定什么是serializer,但我想它来自from django.core import serializers。根据{{​​3}},确实将对象列表映射到这种布局:

[
    {
        "pk": "4b678b301dfd8a4e0dad910de3ae245b",
        "model": "sessions.session",
        "fields": {
            "expire_date": "2013-01-16T08:16:59.844Z",
            ...
        }
    }
]

我看不到自定义序列化程序行为的方法, 但您始终可以手动重新序列化自己。 例如,使用json包,您可以这样做:

# at the top of the script
import json

# ...

def thanks_deposit_payment(request):    
    # ...

    order_items_serialized = serialize('json', order_items, fields=['id', 'sku', 'name', 'price', 'size', 'quantity'])

    # convert the serialized string to a Python object
    order_items_obj = json.loads(order_items_serialized)

    # define the target mapping
    def mapper(p):
        return {
            'id': p['pk'],
            'sku': p['fields']['sku'],
            'name': p['fields']['name'],
            # ... and so on ...
        }

    # re-map and re-serialize the items
    order_items = json.dumps(list(map(mapper, order_items_obj)))