将主键放在 JSON 响应中

Place Primary key inside JSON response

我收到的 JSON 回复如下。

在我的代码中,我试图按照上面的 img 从数据库中获取列表。结果 primary key 出现在每条记录的字段之外。我如何将它放在每条记录的字段中,例如。

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

下面是我的代码:

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

@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”。 “字段”又是一个对象,其中包含每个字段的名称和值,分别为 属性 和 property-value。

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

如果您查看负责对象最终 JSON 输出的 Serializer class implementation you can find a get_dump_object 方法。即

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 序列化器 class 并覆盖 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