2015-07-09 162 views
0

因此,在閱讀了Django REST Framework文檔和一些教程之後,我仍然無法理解如何使用Django序列化程序將傳入的POST(JSON)數據轉換爲Python對象(對不起,我是新手) 。如何使用Django REST序列化器?

鑑於我發佈了一個JSON字符串,比如說api/foo/bar,我該如何編寫它的序列化程序?

例JSON:

{ 'name': 'Mr. Foo', address:'Bar Street' } 

我的控制器,富一個酒吧方法如下:

@detail_route(
    methods=['post'] 
) 
def bar(self, request, uuid=None): 
    serializer = MySampleSerializer(data=request.DATA) 

    something.clone(serializer.object) 
    return Response(status=status.HTTP_201_CREATED) 

誰能給我解釋一下我應該序列化是什麼樣子?我如何從串行器訪問序列化的數據?

+0

你確定你已經閱讀了整個教程?我也是新手,但我發現它非常好寫和有用:它允許我立即添加一個json-web-api到我的應用程序。具體而言,不使用CBV的原因是什麼? (例如ModelViewSet) – Pynchia

+0

您是否製作過任何Django模型,就像本教程中的「Snippet」一樣? http://www.django-rest-framework.org/tutorial/1-serialization/就像@Pynchia說的;本教程編寫得非常好,如果您完全遵循,應該會有很少的混淆。 – pingul

+0

我讀過它 - 但是我希望能夠在沒有模型的情況下使用數據。 – JB2

回答

6

當你不想使用模型,你必須從頭開始創建序列化。像這樣的東西也許應該工作:

class MySerializer(serializers.Serializer): 
    name = serializers.CharField(max_length = 100) 
    adress = serializers.CharField(max_length = 100) 

然後你可以在這樣的請求,使用它:

def bar(self, request, uuid=None): 
    data = JSONParser().parse(request) 
    serializer = MySerializer(data = data) 
    return Response(status=status.HTTP_201_CREATED) 

不過請注意,因爲你還沒有創建的Django模型,你就不能保存序列化數據(因此沒有將被保存在數據庫中)

+0

謝謝!還有一個問題:一旦我有序列化器對象,我如何訪問這些字段? serializer.data.get()? – JB2

+1

我建議您將序列化程序與Django模型對象結合使用,但是您可以通過'name = serializer.data [「name」]' – pingul

+1

訪問數據,您可能需要使用序列化程序進行驗證。因此,在檢查數據有效後,可以通過'serializer.validated_data'訪問它。否則,你可能只是用JSONparser休息一下,忽略序列化器。 – Pynchia

3

基本上,您將JSON數據傳遞給序列化程序,然後訪問將返回有序字典的數據字段。

def bar(self, request, uuid=None): 
    serializer = MySampleSerializer(data=request.data) 
    if serializer.is_valid(raise_exception=True): 
     my_object = serializer.data # Grab the dict of values 

要定義一個串行:

class MySampleSerializer(serializers.Serializer): 
    name = serializers.CharField(max_length=30) 
    address = serializers.CharField(max_length=30) 
+0

很好的答案。但請參閱OP最近的評論:「我希望能夠在沒有模型的情況下使用數據。」 – Pynchia

+0

謝謝你這個簡潔的答案!不過,正如Pynchia所說:我希望能夠在沒有模型的情況下使用它。 – JB2

+0

您無法從序列化程序中獲取原始python對象。傳入數據後,您可以訪問serializer.data並接收字典。如果你想要一個python對象,那麼可以實現一個基於json表示創建python對象的自定義創建方法。 –

2

您不必使用ModelSerializer:

from rest_framework import serializers 

class CommentSerializer(serializers.Serializer): 
    email = serializers.EmailField() 
    content = serializers.CharField(max_length=200) 
    created = serializers.DateTimeField() 

和訪問:

serializer = CommentSerializer(data=data) 
serializer.is_valid() 
# True 
serializer.validated_data 

的方式,所有上述是從DRF website

+0

你的回答是誤導性的,因爲問題是關於通過POST接收數據(即反序列化)。 – Pynchia

+0

它是如何誤導?我清楚地閱讀了「我該如何編寫序列化程序?」這個問題......並且他提到不使用模型......他可以很容易地從答案的後半部分的文檔 – Incognos

+0

中獲得大部分答案。你正在展示如何序列化。你應該展示如何去seralize(和驗證)而不是 – Pynchia

相關問題