2015-08-20 14 views
5

Vedo che c'è un progetto chiamato djangorestframework-camel-case, che consente di utilizzare JavaScript-ish camelCase con campi underscore_cased nei serializzatori Django REST. Quindi, in sostanza, posso inviare:camelCase dati POST in Django REST Framework

{ 
    "camelCase": "foo" 
} 

E riceverlo con i seguenti Serializer:

class MySerializer(serializers.Serializer): 
    session_id = serializers.CharField() 

fa qualcosa di simile per i dati POST esiste? Quindi posso inviare camelCase=foo via POST e riceverlo in un campo underscore_case nel mio serializzatore?

Ho provato a implementare il mio parser sulla base di FormParser:

class CamelCaseFormParser(FormParser): 
    media_type = 'application/x-www-form-urlencoded' 

    def __init__(self): 
     print("initialized") 

    def parse(self, stream, media_type=None, parser_context=None): 
     print("parse") 
     ... 

E, dopo aver aggiunto al DEFAULT_PARSER_CLASSES in settings.py, mentre initialized viene stampata, parse non è. Quindi, in caso di dati POST, il parser application/x-www-form-urlencoded non viene utilizzato affatto.

Dal Serializzatori sono utilizzati così:

Serializer(data=request.data) 

sto pensando di sottoclassi Serializzatore e la modifica data prima che viene ulteriormente elaborato, o addirittura modificarlo prima di creare un serializzatore. Ma quello che sto chiedendo è un modo più conveniente, lavorando per tutti i serializzatori, senza sottoclassi.

risposta

3

perché non si attacca ai parser?

from djangorestframework_camel_case.util import underscoreize 
from rest_framework import parsers 
from django.conf import settings 
from django.http import QueryDict 


class CamelCaseFormParser(parsers.FormParser): 
    def parse(self, stream, media_type=None, parser_context=None): 
     parser_context = parser_context or {} 
     encoding = parser_context.get('encoding', settings.DEFAULT_CHARSET) 
     data = QueryDict(stream.read(), encoding=encoding) 
     return underscoreize(data) 

semplice, di lavoro e correttamente posizionato ...