python - 序列化程序在 Javascript 中添加了不必要的字段

标签 python django

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

However, they final array has extra field that may be causing problems with Google Analytics requested format.

Google Analytics 请求的格式:

Notice the structure of the products Array

<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

包含序列化程序的 View :

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

模板中的数据层:

这是生成需要更改的 Products 数组的行:

 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 预期的格式?

最佳答案

您没有指定什么是serializer,但我推测它来自from django.core import serializers。根据 documentation ,实际上它将对象列表映射到这种布局:

[
    {
        "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)))

关于python - 序列化程序在 Javascript 中添加了不必要的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56258672/

相关文章:

python - Django AllAuth 给出 SSLError

python - 使用 openCV : empty video 在 python 中保存视频捕获

python - 使用 NLTK 将两个字符串匹配在一起?

python - 如何在我的网站上将 WMD markdown 语法转换为 HTML?

python - 遵循 Django 照片应用程序教程时解码器 JPEG 不可用错误

调用 exec 的 Python 内存错误

python - 如何使用计算数据创建历史数据框?

python - Errno 13 权限在 django-wkhtmltopdf 中被拒绝

Django 原子事务实际上不是原子的?

python - 导入时,django-import-export csv header 之前的空行触发异常