2017-12-08 147 views
9

biçimlendirmesi nedeniyle json dizi sonucu yanıtını özelleştirme Json yanıtı için liste sorgusu sonucunu özelleştirmek istediğim bu Django REST API'ım var. Nedeni tarih biçimlendirmesi ve potansiyel olarak diğer biçimlendirmelerden kaynaklanmaktadır.django dinlenme çerçeve listesi sorgusu

Bu, Rest API'sidir, sorun create_at: Bunun gibi biçimlendirilmesini istiyorum: ('% Y-% m-% d% H:% M'). Aşağıdaki kod herhangi bir biçimlendirmeye sahip değildir, sadece sonuçta bir json listeleyecek ve oluşturacaktır.

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

Bu modeldir. Dikkat edin .as_dict() işlevi var. Emp = Employee.objects.get (id = 6) kullanmak gibi tek tek kayıt için, bu emp.as_dict() yöntemini kullanabilirim ve sonuç, biçimlendirilmiş biçimde, biçimlendirilmiş bir tarih içerecektir.

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')} 

Bu, listenin json yanıtı sonucudur. Tarihin biçimlendirilmemiş olduğuna dikkat edin.

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

Soru: İstediğim biçimleme ile json listesi yanıtını nasıl alabilirim? Django kalan çerçevenin

+0

gelen ref alabilirim? –

+0

Hey @Axil, merak ettim, herhangi bir cevap size yardımcı oldu mu? – Satendra

+0

üzgünüm çok meşguldüm. – Axil

cevap

8

kullanın serializers, bir serileştirici sınıfını

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

çalışanlarınızın serileştirici sınıfını kullanarak sorgu kümesi ayrıştırmak oluşturun.

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

Biçim dizeleri ya açıkça biçimini veya ISO 8601 tarzı tarihsaat kullanılması gerektiğini belirtir özel dize iso-8601 belirtmek Python strftime formats olabilir. (Örn 2013-01-29T12:34:56.000000Z)

+0

çalışır. serializer'da yeni bir alan yaratmak mümkün olabilir mi? Görüntüm varmış gibi, 3 çeşit çıktı almak istiyorum? image = {orig = "url1", küçük = "url2", medium = "url3"} – Axil

+0

Evet, [SerializerMethodField] 'dan faydalanabilirsiniz (http://www.django-rest-framework.org/api Çıkışı özelleştirmek için -guide/fields/# serializermethodfield). – Satendra

0
Sen proje settings.py dosyasını ayarı formt zamanı tanımlamak için deneyebilirsiniz

, zaman formatı ayarı 4 çeşit vardır: DATE_FORMAT, DATETIME_FORMAT, TIME_FORMAT, SHORT_DATETIME_FORMAT. örneğin

: Eğer DFR'yi kullanırsanız, ayrıca proje küresel tarih biçimi ayarlarını tanımlamak için bu yöntemi kullanabilirsiniz

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

. Django paginator içinde `as_dict` yöntemi kullanmalısınız neden

Sen https://docs.djangoproject.com/en/2.0/ref/settings/#std:setting-DATETIME_FORMAT

İlgili konular