直接使用反序列化的 Django 对象
Using a Deserialized Django Object Directly
我找到了很多关于在 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>
我知道我可以循环遍历生成器以收集值...但它减少了知道此生成器仅包含一个对象...我需要直接访问而不循环
Django 不会急切地反序列化,它会懒惰地工作:它只会在您需要这些项目时反序列化,例如枚举它。
您可以通过构造列表来制作模型对象列表:
clean_data = <strong>list(</strong>serializers.deserialize('json', data)<strong>)</strong>
如果你只想枚举,你可以简单地留下一个生成器,然后在模板中枚举它。然后生成器将一个一个地反序列化对象,从而在 {% for … %} … {% endfor %}
循环中发出这些对象。
我找到了很多关于在 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>
我知道我可以循环遍历生成器以收集值...但它减少了知道此生成器仅包含一个对象...我需要直接访问而不循环
Django 不会急切地反序列化,它会懒惰地工作:它只会在您需要这些项目时反序列化,例如枚举它。
您可以通过构造列表来制作模型对象列表:
clean_data = <strong>list(</strong>serializers.deserialize('json', data)<strong>)</strong>
如果你只想枚举,你可以简单地留下一个生成器,然后在模板中枚举它。然后生成器将一个一个地反序列化对象,从而在 {% for … %} … {% endfor %}
循环中发出这些对象。