Python 使用json序列化程序时从查询集中返回详细名称
可以打电话吗Python 使用json序列化程序时从查询集中返回详细名称,python,json,django,Python,Json,Django,可以打电话吗 tasks = models.Conference.objects.filter(location_id=key) data = serializers.serialize("json", tasks) 让它返回verbose字段名而不是变量名?实现这一点的一种方法是,通过对django.core.serializers.python.Serializer类中的方法进行猴子补丁,以返回每个字段的verbose\u名称,而不是标准名称属性 以下面的代码为例 models.py 我在
tasks = models.Conference.objects.filter(location_id=key)
data = serializers.serialize("json", tasks)
让它返回verbose字段名而不是变量名?实现这一点的一种方法是,通过对
django.core.serializers.python.Serializer
类中的方法进行猴子补丁,以返回每个字段的verbose\u名称,而不是标准名称属性
以下面的代码为例
models.py
我在数据库中创建这些模型对象
RelatedNode.objects.create(name='related_node_1')
RelatedNode.objects.create(name='related_node_2')
RelatedNode.objects.create(name='related_node_fk')
Node.objects.create(name='node_1', related_node=RelatedNode.objects.get(name='related_node_fk'))
Node.objects.all()[0].related_nodes.add(RelatedNode.objects.get(name='related_node_1'))
Node.objects.all()[0].related_nodes.add(RelatedNode.objects.get(name='related_node_2'))
views.py
这是给我的
u'[{"fields": {"verbose fk related node": 3, "verbose related m2m nodes": [1, 2], "verbose name": "node_1"}, "model": "testing.node", "pk": 1}]'
正如我们所看到的,这实际上会返回每个字段的详细名称,作为返回字典中的键
from testing.models import Node
from django.utils.encoding import smart_text, is_protected_type
from django.core.serializers.python import Serializer
from django.core import serializers
def monkey_patch_handle_field(self, obj, field):
value = field._get_val_from_obj(obj)
# Protected types (i.e., primitives like None, numbers, dates,
# and Decimals) are passed through as is. All other values are
# converted to string first.
if is_protected_type(value):
self._current[field.verbose_name] = value
else:
self._current[field.verbose_name] = field.value_to_string(obj)
def monkey_patch_handle_fk_field(self, obj, field):
if self.use_natural_foreign_keys and hasattr(field.rel.to, 'natural_key'):
related = getattr(obj, field.name)
if related:
value = related.natural_key()
else:
value = None
else:
value = getattr(obj, field.get_attname())
self._current[field.verbose_name] = value
def monkey_patch_handle_m2m_field(self, obj, field):
if field.rel.through._meta.auto_created:
if self.use_natural_foreign_keys and hasattr(field.rel.to, 'natural_key'):
m2m_value = lambda value: value.natural_key()
else:
m2m_value = lambda value: smart_text(value._get_pk_val(), strings_only=True)
self._current[field.verbose_name] = [m2m_value(related)
for related in getattr(obj, field.name).iterator()]
Serializer.handle_field = monkey_patch_handle_field
Serializer.handle_fk_field = monkey_patch_handle_fk_field
Serializer.handle_m2m_field = monkey_patch_handle_m2m_field
serializers.serialize('json', Node.objects.all())
u'[{"fields": {"verbose fk related node": 3, "verbose related m2m nodes": [1, 2], "verbose name": "node_1"}, "model": "testing.node", "pk": 1}]'