django rest框架列表查询自定义json数组结果响应,因为日期格式

Posted

技术标签:

【中文标题】django rest框架列表查询自定义json数组结果响应,因为日期格式【英文标题】:django rest framework list query customize json array result response because of date formatting 【发布时间】:2018-05-23 05:21:26 【问题描述】:

我有这个 Django REST API,我想自定义 json 响应的列表查询结果。原因是日期格式和其他可能的格式。

这是 Rest API,问题是 created_at 我希望它的格式如下:('%Y-%m-%d %H:%M')。以下代码没有任何格式,它只会列出并在结果上创建一个 json。

@api_view(['POST'])
def employee_get_list_by_page(request):
    val_params = ["id", "username","first_name","last_name","created_at"]    
    employee_list = Employee.objects.all().values(*val_params).order_by('id')  

    page = request.GET.get('page', request.POST['page'])
    paginator = Paginator(employee_list, request.POST['page_limit'])

    try:
        employees = paginator.page(page)
    except PageNotAnInteger:
        employees = paginator.page(request.POST['page'])
    except EmptyPage:
        employees = paginator.page(paginator.num_pages)

    return Response(list(employees), status=status.HTTP_200_OK)    

这是模型。注意我有 .as_dict() 函数。对于像使用 emp = Employee.objects.get(id=6) 这样的个人记录,我可以这样做 emp.as_dict() 并且结果将在 created_at 中具有格式化的日期。

class Employee(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='employee')
    company = models.ForeignKey(Company)
    username = models.CharField(max_length=30, blank=False)    
    first_name = models.CharField(max_length=30, blank=False)
    last_name = models.CharField(max_length=30, blank=False)    
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.user.username

    def as_dict(self):
        return "id": "%d" % self.id,
                "username": self.username if self.username else "",
                "first_name": self.first_name if self.first_name else "",
                "last_name": self.last_name if self.last_name else "",              
                "created_at":self.created_at.strftime('%Y-%m-%d %H:%M')

这是列表的json响应结果。请注意日期未格式化。

[
  
    "id": 7,
    "username": "mick",
    "first_name": "zack",
    "last_name": "ray",
    "created_at": "2017-12-07T10:09:28.376427Z" <-- I want this to be ('%Y-%m-%d %H:%M')
  ,
  
    "id": 8,
    "username": "hu",
    "first_name": "rar",
    "last_name": "baw",
    "created_at": "2017-12-10T09:08:27.473997Z"
    
]

问题:如何获得我想要的格式的 json 列表响应?

【问题讨论】:

为什么 django 应该在分页器中使用你的 as_dict 方法? 嘿@Axil,我想知道,任何答案对你有帮助吗? 对不起,我太忙了。会试试看。 【参考方案1】:

使用django rest框架的serializers,创建一个序列化器类

from rest_framework import serializers

class EmployeeSerializer(serializers.ModelSerializer):
    created_at = serializers.DateTimeField(format='%Y-%m-%d %H:%M')

    class Meta:
       model = Employee
       fields = ("id", "username", "first_name", "last_name", "created_at")

现在使用序列化程序类解析您的员工查询集。

@api_view(['POST'])
def employee_get_list_by_page(request): 
    employees = Employee.objects.all().values(*val_params).order_by('id')
    serializer = EmployeeSerializer(employees, many=True)

    # rest of your code
    ...

    return Response(serializer.data, status=status.HTTP_200_OK)  

格式字符串可以是Python strftime formats 指定格式或特殊字符串iso-8601,表示 应该使用ISO 8601 样式的日期时间。 (例如 2013-01-29T12:34:56.000000Z)

【讨论】:

它有效。序列化程序中是否可以创建一个新字段?如果我有图像,我想输出 3 种类型?图片 = orig = "url1",小 = "url2",中 = "url3" 是的,您可以使用SerializerMethodField 来自定义输出。【参考方案2】:

你可以尝试在项目的settings.py文件中定义时间格式设置,时间格式设置有4种:DATE_FORMAT、DATETIME_FORMAT、TIME_FORMAT、SHORT_DATETIME_FORMAT。

例如:

DATE_FORMAT = 'Y-m-d H:i'

如果你使用DRF,你也可以使用这个方法来定义项目全局日期格式设置。

你可以从https://docs.djangoproject.com/en/2.0/ref/settings/#std:setting-DATETIME_FORMAT获取参考

【讨论】:

以上是关于django rest框架列表查询自定义json数组结果响应,因为日期格式的主要内容,如果未能解决你的问题,请参考以下文章

带有自定义查询的Django Rest框架

如何在 django rest 框架中定义列表字段?

Django rest 框架序列化程序返回一个列表而不是 json

使用 Django Rest Framework 自定义 JSON 回调

如何在 django rest 框架中添加自定义权限和角色

Django rest 框架 JWT 和自定义身份验证后端