2017-12-08 162 views
9

Mam to Django REST API, które chcę dostosować wynik kwerendy listy dla odpowiedzi json. Powodem jest formatowanie daty i potencjalnie również inne formatowanie.Zapytanie o listę ram Django spersonalizuj odpowiedź wynikową tablicy json z powodu daty formowania

To jest interfejs API odpoczynku, problem został utworzony. Chcę go sformatować w następujący sposób: ("% Y-% m-% d% H:% M"). Poniższy kod nie ma żadnego formatowania, po prostu wyświetli listę i utworzy json na wyniku.

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

To jest model. Zauważ, że mam funkcję .as_dict(). Dla pojedynczego rekordu, takiego jak emp = Employee.objects.get (id = 6), mogę zrobić to tak emp.as_dict(), a wynik będzie miał sformatowaną datę w 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')} 

To jest odpowiedź json z listy. Zwróć uwagę, że data nie jest sformatowana.

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

Pytanie: Jak mogę uzyskać odpowiedź listy json z żądanym formatowaniem?

+0

dlaczego Django należy użyć 'metody as_dict' w paginator? –

+0

Hej @ Asil, zastanawiałem się, czy jakaś odpowiedź ci pomogła? – Satendra

+0

Przepraszam, byłam bardzo zajęta. Spróbuj. – Axil

Odpowiedz

8

Zastosowanie serializers Django spoczynku ramach utworzyć klasę 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") 

teraz analizować pracownicy QuerySet za pomocą klasy 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 struny może być albo Python strftime formats który wyraźnie określić format lub specjalną ciąg iso-8601, co wskazuje, że ISO 8601 stylu datetimes powinny być stosowane. (Np 2013-01-29T12:34:56.000000Z)

+0

to działa. czy w serializatorze będzie możliwe utworzenie nowego pola? tak jak mam obraz, chcę wydrukować 3 typy? image = {orig = "url1", small = "url2", medium = "url3"} – Axil

+0

Tak, jest możliwe, że możesz skorzystać z [SerializerMethodField] (http://www.django-rest-framework.org/api -guide/fields/# serializermethodfield), aby dostosować wyjście. – Satendra

0

Można spróbować zdefiniować czas formt ustawienie w pliku settings.py projektu, istnieją 4 rodzaje ustawieniu Format czasu: DATE_FORMAT, DATETIME_FORMAT, TIME_FORMAT, SHORT_DATETIME_FORMAT.

na przykład:

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

jeśli używasz DRF, można również skorzystać z tej metody, aby zdefiniować ustawienia formatu daty projektu globalnego.

Można uzyskać ref z https://docs.djangoproject.com/en/2.0/ref/settings/#std:setting-DATETIME_FORMAT