2014-12-06 243 views
3

我在哪裏可以設置相關的模型,當我創造APIView對象等價?Django的REST的架構 - 什麼是「perform_create」的APIView

def perform_create(self, serializer): 
    serializer.save(owner=self.request.user) 

generics.ListAPIView上述作品,但怎麼樣APIView?我有兩個型號ABB有一個ForeignKeyA。在創建B實例時,如何在保存之前設置ForeignKey

a = A.objects.get(id=request.DATA['a_id']) 
serializer = BSerializer(data=request.DATA) 

    if serializer.is_valid(): 
      b = serializer.save(a=a) 

如果我包括BSerializera領域,這種抱怨a This field is required。如果我排除它,那麼它會給出一個IntegrityError。它應該如何完成?

回答

9

Django的REST框架3.0:

perform_create可通過仿製藥API,這就是爲什麼它的工作原理爲GenericAPIView和任何子類(包括ViewSet實例)。

你得到的錯誤是在串行器級別,甚至在你達到serializer.save的點之前,所以perform_create不會完全幫助你。如果用戶將永遠不會被提交對象的全嵌套表示(和你的串行期待一個),那麼最好的辦法是讓現場read_only,並通過它傳遞到serializer.save方法處理它的串行之外。

Django的REST框架2.4:

perform_create是在Django的REST框架3.0的新,所以當前文件不匹配您正在使用的版本。如果您可以升級到Django REST Framework 3.0,建議您這樣做。

在Django中REST框架2.4,串行化器包含對正在創建或在serializer.object屬性修改的模型對象的引用。對於ModelSerializer,這是模型對象,其中傳入的任何更改(假設它通過驗證)。調用serializer.save只是保存這個對象(同時重建關係),所以你可以直接修改它。

要調用serializer.save()(不帶參數)之前設置當對象被保存或創建所需的外鍵關係,你只需要做......

serializer.object.related_field = related_object 

...。在Django REST Framework 2.4中,任何傳遞給serializer.save的參數都會降低到model.save,這就是爲什麼您無法使用爲Django REST Framework 3.0推薦的方法。在3.0中,serializer.save允許您傳遞將直接設置在應該創建的對象上的額外參數(設置serializer.validated_data的更好方法),而不是將它們傳遞到model.save

+0

使用'serializer.save(myforeignkeyfield = A.Object.get(PK = 1)'給了我這個錯誤:'保存()得到了一個意外的說法...'我很想與保存相關模型相關聯。 ()但這是我得到的東西,至少在2.4版本。 – norbertpy 2014-12-08 19:30:25