gpt4 book ai didi

python - 将主键放在 JSON 响应中

转载 作者:行者123 更新时间:2023-12-01 07:35:19 28 4
gpt4 key购买 nike

我收到的 JSON 响应如下。

enter image description here

在我的代码中,我尝试从数据库中获取列表,如上面的图片所示。在结果中,主键位于每条记录的字段之外。我如何将它放置在每条记录的字段中,例如。

"results":[
"fields":{
"pk": "F09087687633",
"company_name": "Tata",
}
]

下面是我的代码:

views.py (在下面的代码中,for循环是从结果中删除应用程序名称,我用同样的方法删除主键,它正在工作,但我如何将它放在每个字段中。 )

@csrf_exempt
def fleet_owner_list(request):
page_number = json.loads(request.body)
records,total_pages = FleetOwner.get_all_owners(page_number)
for data in range(len(records)):
del records[data]['model']
returnObject = {
"page" : page_number,
"total_results":len(records),
"total_pages":total_pages,
"status" : messages.RETRIVAL_SUCCESS,
"message" : messages.FLEETOWNER_DATA_RETRIEVE_SUCCESS,
"results" : records
}

models.py

@classmethod
def get_all_owners(cls,page_number):
data = cls.objects.filter(is_deleted = False)
page_numbers = page_number
pegination_result, total_page_count = list_paginate(data, page_numbers)
data = serializers.serialize("json", pegination_result)
data = json.loads(data)
return data, total_page_count

paginator.py(这是我用于所有列表函数执行 django 分页的常用函数。)

def list_paginate(data,page_numbers):
paginator = Paginator(data,10)
page = page_numbers
try :
records = paginator.page(page)
except PageNotAnInteger:
records = paginator.page(1)
except EmptyPage:
records = paginator.page(paginator.num_pages)
return records, paginator.num_pages
pegination_result, total_page_count = list_paginate(data, page_numbers)
data = serializers.serialize("json", pegination_result)
data = json.loads(data)
return data, total_page_count

最佳答案

默认情况下,这就是 Django 将查询集序列化为 JSON 对象的方式。 The Django documentation also state the same整个集合仅表示为一个数组,对象由具有三个属性的 JSON 对象表示:“pk”、“model”和“fields”。 “fields”又是一个对象,其中包含每个字段的名称和值分别作为属性和属性值。即,

[
{
"pk": "4b678b301dfd8a4e0dad910de3ae245b",
"model": "sessions.session",
"fields": {
"expire_date": "2013-01-16T08:16:59.844Z",
...
}
}
]

如果你看Serializer类实现你可以找到get_dump_object方法负责对象的最终 JSON 输出。即,

def get_dump_object(self, obj):
data = {'model': str(obj._meta)}
if not self.use_natural_primary_keys or not hasattr(obj, 'natural_key'):
data["pk"] = self._value_from_field(obj, obj._meta.pk)
data['fields'] = self._current
return data

在其他团队中,这是负责以下格式的方法,

{
"pk": "pk",
"model": "model",
"fields": {
"field1": "2013-01-16T08:16:59.844Z",
...
}
}

由于您希望在 fields 中使用 pk 字段,因此您应该创建自己的 JSON 序列化器类并覆盖 get_dump_object方法如下,

>>> import json
>>> from pprint import pprint
>>> from django.core.serializers.json import Serializer as JSONSerializer
>>>
>>> class MyCustomSerializer(JSONSerializer):
... def get_dump_object(self, obj):
... data = {'model': str(obj._meta)}
... data['fields'] = self._current
... if not self.use_natural_primary_keys or not hasattr(obj, 'natural_key'):
... data['fields'].update({'pk': self._value_from_field(obj, obj._meta.pk)})
... return data
...
>>> pprint(json.loads(MyCustomSerializer().serialize(User.objects.all())))
[{'fields': {'date_joined': '2019-07-13T05:52:37.885Z',
'email': 'user1@gmail.com',
'first_name': 'User',
'groups': [],
'is_active': True,
'is_staff': False,
'is_superuser': False,
'last_login': None,
'last_name': '1',
'password': '',
'pk': 1,
'user_permissions': [],
'username': ''},
'model': 'auth.user'}]
# You can see that `pk` is now inside the 'fields' key.
>>> json.loads(MyCustomSerializer().serialize(User.objects.all()))[0]['fields']['pk']
1

关于python - 将主键放在 JSON 响应中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57016318/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com