Сериализатор добавляет ненужные поля в Javascript - PullRequest
2 голосов
/ 22 мая 2019

Мне нужно создать очень чистую структуру массива JS из Django Queryset.Для этого я использую сериализатор.

Однако в их окончательном массиве есть дополнительное поле, которое может вызывать проблемы с запрошенным форматом Google Analytics.

GoogleФормат запроса:

Обратите внимание на структуру массива 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

Представление, содержащее сериализатор:

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: 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 Ответ

1 голос
/ 24 мая 2019

Вы не указали, что такое serializer, но я предполагаю, что оно исходит от from django.core import serializers. Согласно документации , действительно, он отображает список объектов в этот вид макета:

[
    {
        "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)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...