2016-05-14 87 views
2

我已經開始使用Django REST框架。我想要做的是用一些JSON發佈請求,從中創建一個Django Model對象,然後使用該對象而不保存它。我的Django模型叫做SearchRequest。我擁有的是:Django REST序列化程序:在不保存的情況下創建對象

@api_view(['POST']) 
def post_calculation(request): 
    if request.method == 'POST': 
     #JSON to serializer object 
     serializer = SearchRequestSerializer(data=request.data) 
     if (serializer.is_valid() == False): 
      return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 
     mySearchRequestObject = serializer.save() 

這確實會創建一個SearchRequest對象,但是會立即將其保存到數據庫中。我會需要它而不保存。如果您使用的是Generic View,或直接使用mixins.CreateModelMixin

mySearchRequestObject = serializer.create() 
+0

你的代碼沒有顯示你調用了save()嗎?或者也許我錯了 –

+0

最後一行:serializer.save() – Botond

回答

4

此方法添加到您的SearchRequestSerializer

def create(self, validated_data): 
    return SearchRequest(**validated_data) 

,並調用它在功能上post_calculation代替save,像這樣你的觀點,你可能發現自己處於需要訪問perform_create方法中的對象的情況。您可以使用摩西Koledoye的想法,但不保存創建對象:

def perform_create(self, serializer): 
    # Create an instance WITHOUT saving 
    instance = self.model(**serializer.validated_data) 
    # ... do more stuff with the instance 
    # ... 
    # THEN, if you need to save the instance later 
    instance.save() 

這是不是有這個perform_create方法,它允許您訪問的實例,但需要你保存它,這可能是個壞行instance = serializer.save()一些方法,如

  • 您需要訪問模型的方法,然後才能創建實例
  • 你需要的情況下存在訪問操縱它的一些數據,所以你必須將它保存兩次
+0

謝謝!你能解釋一下嗎?我只能使用serializer.create(serializer.validated_data) – Botond

+0

OK,我現在明白了。我所做的是更改爲返回SearchRequest(** self.validated_data) – Botond

+1

它將您驗證的數據解包並使用生成的關鍵字參數來實例化SearchRequest類。就像你會在一個好的Django日實例化這個類一樣 –

1

相關問題