将主键放在JSON响应中

时间:2019-07-13 05:06:21

标签: python django postman jsonresponse

我得到的JSON响应如下。

enter image description here

在我的代码中,我正在尝试根据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

1 个答案:

答案 0 :(得分:1)

默认情况下,这是Django将查询集序列化为JSON对象的方式。 The Django documentation also state the same整个集合仅表示为数组,而对象则由具有三个属性的JSON对象表示:“ pk”,“ model”和“ 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",
            ...
        }
    }

由于要在pk内包含fields字段,因此应创建自己的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