Как изменить сериализованные атрибуты объектов в Django? - PullRequest
0 голосов
/ 21 мая 2019

Мне нужно изменить поле product на name моих объектов OrderItem из-за того, как Google Enhanced Ecommerce запрашивает данные для обработки.

Обязательные поля для электронной торговли Google Analytics:

https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#product-data

Рабочий пример

https://developers.google.com/tag-manager/enhanced-ecommerce#purchases

Как уже говорилось, в моей модели это поле имеет вид product, но Google нужно, чтобы оно было названо name, вместо

возможно ли изменить его в представлении?Или мне нужно как-то изменить его в HTML, используя Javascript?

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', 'product', '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

template:

<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>

models.py

class OrderItem(models.Model):
    order = models.ForeignKey(Order, on_delete=models.CASCADE)
    product = models.CharField(max_length= 200)
    sku = models.CharField(max_length=20)
    quantity = models.CharField(max_length= 200)
    size = models.CharField(max_length=200)
    price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name= 'PEN Price')
    file = models.FileField(upload_to='files', blank=True, null=True)
    comment = models.CharField(max_length=200, blank=True, null=True, default='')
    uploaded_at = models.DateTimeField(auto_now_add=True)

ОБНОВЛЕНИЕ 1

Благодаря ответу ruddra я получаю «product» поменять на «name»', но dataLayer показывает:

Uncaught SyntaxError: missing ) after argument list

products: JSON.parse('[{'sku': 'M1', 'quantity': '10', 'size': 'varios', 'price': '3.00', 'name': 'Sobre con muestras'}]')

Это произойдет только в том случае, если я изменю представление с ответом на это предложение.

Ответы [ 2 ]

2 голосов
/ 21 мая 2019

Вы можете аннотировать набор запросов так, чтобы у результата было поле name

q = Q(order=Order.objects.latest('id'))
order_items = OrderItem.objects.filter(q).annotate(name=F('product'))

Затем замените product на name в полях сериализатора.

Редактировать: СпасибоКомментаторам за указание, что это на самом деле не работает, потому что serialize Django будет только сериализовать атрибут, являющийся полями в модели.Вам также придется написать собственный сериализатор.

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

Можно изменить вид, вы можете сделать это так:

order_items = serialize('json', order_items, fields=['id', 'product', 'price'])  # the fields needed for products

order_items_json = json.loads(order_items)
products_list = []
for item in order_items_json:
    product_dict = item.get('fields')
    product_dict['name'] = product_dict.pop('product')
    products_list.append(product_dict)

return render('template_name.html', dict(order_number=order_number, total=total, order_items=json.dumps(products_list), costo_despacho=costo_despacho))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...