2017-09-23 66 views
1

我要在數據庫中創建一個新的記錄如何自定義字段,我將像下面的模型:在Django的REST框架串行

class FooModel(models.Model) 
    subject_key= models.CharField(max_length=2) 
    subject= modeels.CharField(max_length=100) 

我想要做的是這樣的:場「subject_key」應該是由客戶端提供,並使用subject_key,服務器將找到值'subject'並將其放入數據庫中。

所以我試着用ModelSerializer創建一個新的記錄。

class FooSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = FooModel 

    def get_subject(self, obj): 
     if obj.subject == 'SO': 
      return 'Stack Overflow' 
     else: 
      return 'Nothing in here' 

和主視圖REST API內部運行的代碼是:

class FooView(APIView): 
    def post(self, request, *args, **kwargs): 
     serializer = FooSerializer(data=request.data) 
     if serializer.is_valid(raise_exception=True) 
      serializer.save() 
      foo = serializer.data 

我檢查它成功地在數據庫中創建一個新的紀錄,但新的記錄具有NULL與列「主題」

我應該如何動態設置序列化器中的字段值?

+0

你如何從請求用戶獲取主體價值或通過您的要求參數 – Robert

+0

@羅伯特也許我在縮短我的代碼的時候讓你有點困惑。我再次編輯它,當用戶請求POST – Kari

+0

獲得subject_vaule時,您需要將該值賦給subject_key,從request.data中獲得subject_value? – Robert

回答

0

聲明中串作爲法領域的學科領域,它總是隻讀(serializermethodfield),你可以爲你的申請例如:在這種方式,您將有樹域在seriaizer 'subject', 'subject_key', 'var_subject'

class FooSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = FooModel 

    def get_var_subject(self, obj): 

也可以將您mehod添加到模型,並使用to_representation

def to_representation(self, instance): 
    representation = super(FooSerializer, self).to_representation(instance) 
    representation['subject'] = instance.get_subject() 
    return representation 

或使用f提起ield to_representation例如相關,但我希望你可以用它

,或者您需要重寫save方法

0

你可以試試這個

def post(self, request, *args, **kwargs): 
     request.data['subject_key'] = request.data['subject'] 
     serializer = FooSerializer(data=request.data) 
     if serializer.is_valid(raise_exception=True) 
      serializer.save() 
      foo = serializer.data