2014-01-13 27 views
1

正在嘗試使用HyperlinkedModelSerializer構建序列化程序,但我有一個場景,我想添加一個字段,該字段在模型中不存在,但我需要該值用於驗證交易,我發現下面的代碼片段Django rest框架在串行器中添加字段僅用於post方法

# -*- coding: utf-8 -*- 
from __future__ import unicode_literals 
from rest_framework import serializers 
import logging 

# initiate logger 
logging.getLogger(__name__) 


class PostHyperlinkedModelSerializerOptions(serializers.HyperlinkedModelSerializerOptions): 
    """ 
    Options for PostHyperlinkedModelSerializer 
    """ 

    def __init__(self, meta): 
     super(PostHyperlinkedModelSerializerOptions, self).__init__(meta) 
     self.postonly_fields = getattr(meta, 'postonly_fields',()) 


class PostHyperlinkedModelSerializer(serializers.HyperlinkedModelSerializer): 
    _options_class = PostHyperlinkedModelSerializerOptions 

    def to_native(self, obj): 
     """ 
     Serialize objects -> primitives. 
     """ 
     ret = self._dict_class() 
     ret.fields = {} 

     for field_name, field in self.fields.items(): 
      # Ignore all postonly_fields fron serialization 
      if field_name in self.opts.postonly_fields: 
       continue 
      field.initialize(parent=self, field_name=field_name) 
      key = self.get_field_key(field_name) 
      value = field.field_to_native(obj, field_name) 
      ret[key] = value 
      ret.fields[key] = field 
     return ret 

    def restore_object(self, attrs, instance=None): 
     model_attrs, post_attrs = {}, {} 
     for attr, value in attrs.iteritems(): 
      if attr in self.opts.postonly_fields: 
       post_attrs[attr] = value 
      else: 
       model_attrs[attr] = value 
     obj = super(PostHyperlinkedModelSerializer, 
        self).restore_object(model_attrs, instance) 
     # Method to process ignored postonly_fields 
     self.process_postonly_fields(obj, post_attrs) 
     return obj 

    def process_postonly_fields(self, obj, post_attrs): 
     """ 
     Placeholder method for processing data sent in POST. 
     """ 
     pass 

class PurchaseSerializer(PostHyperlinkedModelSerializer): 
    """ PurchaseSerializer 
    """ 
    currency = serializers.Field(source='currency_used') 

    class Meta: 
     model = DiwanyaProduct 
     postonly_fields = ['currency', ] 

現在用的是上面的類,PostHyperlinkedModelSerializer,但由於某些原因,上述導致與可瀏覽的API接口供休息的框架問題。字段標籤正在消失,再加上新字段「貨幣」未顯示在表單中(請參閱下面的屏幕截圖以供參考)。任何人都可以幫忙嗎?

enter image description here

回答

1

誰寫的代碼可能並不需要瀏覽的API(正常請求將正常工作)。

爲了解決這個API改變to_native這樣:

def to_native(self, obj): 
    """ 
    Serialize objects -> primitives. 
    """ 
    ret = self._dict_class() 
    ret.fields = self._dict_class() 

    for field_name, field in self.fields.items(): 

     if field.read_only and obj is None: 
      continue 

     field.initialize(parent=self, field_name=field_name) 
     key = self.get_field_key(field_name) 
     value = field.field_to_native(obj, field_name) 

     method = getattr(self, 'transform_%s' % field_name, None) 
     if callable(method): 
      value = method(obj, value) 

     if field_name not in self.opts.postonly_fields: 
      ret[key] = value 

     ret.fields[key] = self.augment_field(field, field_name, key, value) 
    return ret 
相關問題