Прямое использование десериализованного объекта Django

#django #django-serializer

Вопрос:

Я нашел много документации о сериализации набора запросов в django, и я обнаружил, что для сериализации одного объекта или экземпляра модели вам просто нужно было поместить этот экземпляр в список» []». Но вот в чем моя проблема: я сериализовал объект в одном представлении, передал его в сеанс и десериализовал указанный объект в другом представлении, и он работает просто отлично… но то, что я получаю, — это генератор python, как я могу получить исходный объект без генератора?

представление, что я сериализовал объект

 def sales_detail(request, pk=None):
    sales_object = Sales.objects.get(pk=pk)
    data = serializers.serialize('json', [sales_object])
    request.session['data'] = data
    return render(request, 'sales/detail.html', context)
 

представление о том, что я десериализовал объект

 def connect_page(request, item_type=None, item_id=None):
    data  = request.session.get('data', None)
    print("Serialized Obeject from Session: ", data[1:-1])
    clean_data = serializers.deserialize('json', data)
    print("Deserialized object from the session : ",  clean_data)
    ...
    return render(request, 'sales/connections.html', context)

 

Результаты для первой печати

 Serialized Obeject from Session:  {"model": "sales.request", "pk": 1, "fields": {"created": "2021-09-08T14:51:01.891Z", "updated": "2021-09-08T19:48:59.603Z", "description": "asa sja schsac  sjbca dcbl sdac dc ahclbkscj sadc sk c sclbsclbd cS LCzx", "unit_price": 0.0, "owner": 1, "active": false, "urgent_flag": false, "completed": false, "type": "request", "quantity": 1, "edited": true, "slug": "nfs-most-wanted-2005", "title": "NFS Most Wanted 2005", "image": "uploaded_products/default_request.png", "tags": [], "categories": [8, 9]}}
 

Результаты для второй печати

 Deserialized object from the session :  <generator object Deserializer at 0x000001E220703D60>
 

Я знаю, что мог бы просто зациклиться на генераторе, чтобы собрать значение…но это уменьшает знание того, что этот генератор содержит только один объект …мне нужен прямой доступ без зацикливания

Комментарии:

1. Можете ли вы поделиться кодом, с помощью которого вы сериализуете и десериализуете?

2. я поделился кодом

Ответ №1:

Django не будет охотно десериализовываться, он работает лениво: он десериализуется только в том случае, если вам нужны элементы, например, для перечисления над ним.

Вы можете составить список объектов модели, построив список:

 clean_data = list(serializers.deserialize('json', data)) 

Если вы хотите только перечислить, вы можете просто оставить его генератором и перечислить поверх него в шаблоне. Затем генератор десериализует объекты один за другим и, таким образом, выдает их в {% for … %} … {% endfor %} цикле.