2017-12-08 29 views
9

Tôi có API REST Django này mà tôi muốn tùy chỉnh kết quả truy vấn danh sách cho phản ứng json. Lý do là do định dạng ngày và định dạng có khả năng khác.django phần còn lại khung danh sách truy vấn tùy chỉnh json mảng phản ứng kết quả vì ngày hình thành

Đây là API Rest, vấn đề được tạo_at Tôi muốn nó được định dạng như sau: ('% Y-% m-% d% H:% M'). Đoạn mã sau không có bất kỳ định dạng nào, nó sẽ chỉ liệt kê và tạo một json trên kết quả.

@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)  

Đây là mô hình. Lưu ý rằng tôi có hàm .as_dict(). Đối với hồ sơ cá nhân như sử dụng emp = Employee.objects.get (id = 6), tôi có thể làm như thế này emp.as_dict() và kết quả sẽ có ngày được định dạng trong 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')} 

Đây là kết quả phản hồi json của danh sách. Lưu ý ngày không được định dạng.

[ 
    { 
    "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" 
    } 
] 

Câu hỏi: Làm cách nào tôi có thể trả lời danh sách json với định dạng tôi muốn?

+0

tại sao django nên sử dụng 'phương pháp as_dict' của bạn trong paginator? –

+0

Hey @Axil, tôi đã tự hỏi, đã làm bất kỳ câu trả lời đã giúp bạn? – Satendra

+0

xin lỗi tôi đã rất bận rộn. Hãy thử nó. – Axil

Trả lời

8

Sử dụng serializers khung còn lại django, tạo ra một lớp serializer

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") 

Bây giờ phân tích nhân viên của bạn QuerySet sử dụng lớp serializer.

@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) 

Format chuỗi có thể ở Python strftime formats đó một cách rõ ràng xác định định dạng, hoặc chuỗi đặc biệt iso-8601, mà chỉ ra rằng ISO 8601 phong cách datetimes nên được sử dụng. (Ví dụ 2013-01-29T12:34:56.000000Z)

+0

nó hoạt động. nó sẽ có thể trong serializer để tạo ra một lĩnh vực mới? như nếu tôi có hình ảnh, tôi muốn xuất ra 3 loại? image = {orig = "url1", small = "url2", phương tiện = "url3"} – Axil

+0

Có thể bạn có thể sử dụng [SerializerMethodField] (http://www.django-rest-framework.org/api -guide/fields/# serializermethodfield) để tùy chỉnh đầu ra. – Satendra

0

Bạn có thể thử để xác định thời gian formt thiết lập trong file settings.py dự án, có 4 loại thiết lập định dạng thời gian: DATE_FORMAT, DATETIME_FORMAT, TIME_FORMAT, SHORT_DATETIME_FORMAT.

ví dụ:

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

nếu bạn sử dụng DRF, Bạn cũng có thể sử dụng phương pháp này để xác định dự án toàn cầu thiết lập định dạng ngày tháng.

Bạn có thể nhận được ref từ https://docs.djangoproject.com/en/2.0/ref/settings/#std:setting-DATETIME_FORMAT

Các vấn đề liên quan