2016-07-05 8 views
0

私は、Python 2.7.11+でDRF:非モデルシリアライザは、非モデルクラスでは動作しません

をdjangorestframeworkの== 3.3.2を使用しています、私は、このクラスのインスタンスを表すJSONでデータを持っている:

class APITransaction(object): 

    def __init__(self, created_on): #several_other_attrs 
     self.created_on = parser.parse(created_on) # this is Never called 
     # ... several other fields 

    @staticmethod 
    def create(attributes_json): 
     return APITransaction(attributes_json.get('createdOn'), ...) 

シリアライザ:

class TransactionView(viewsets.ViewSet): 
    serializer_class = MySerializer # probably useless 

    def list(self, request): 
     # ... 
     serializer = MySerializer(list_of_json, many=True) 
     return Response(serializer.data) 

class MySerializer(serializers.Serializer): 
    created_on = serializers.DateTimeField() 
    # ... more fields here 

    class Meta: 
     ordering = ['-created_on'] 

    def create(self, validated_data): 
     return APITransaction.create(**validated_data) # why isn't this called? 

    def update(self, instance, validated_data): 
     raise NotImplemented 

は今、私はからそのシリアライザを使用しようとしています

list_of_jsonは、APITransactionクラスを表すjsonのリストです。

は、残念ながら、私はAPITransaction.createは、このように呼ばれることはありませんAPITransaction.__init__内部parser.parseは、文字列をキャストするために使用されることはありませんという事実によって引き起こさ'unicode' object has no attribute 'isoformat'エラーを取得しています。

私はこれがシリアライザの正しい方法ではないことを知っていますが、DRMドキュメントでは、ORM以外のクラスを使用しているときに何をすべきかについて何も言及していません。

どのようにシリアライザを使用することができますか?インスタンスが1つしかない場合は、APITransactionオブジェクトを明示的に作成してMySerializerに渡すことができますが、複数のjsonがある場合、それを自動的に行う方法ではありませんか?

答えて

0

APITransaction.createは、あなたがデータをシリアル化している

と呼ばれることはありません。 createは、デシリアライズ時にのみ呼び出されるため、呼び出されないと予想されます。

listは、データを作成すべきではない安全な方法です。 Viewsetcreateはおそらくあなたが望むものです。さらに、データを検証してシリアライザを保存する必要があります。

特に、step 1 of the Django REST framework tutorialworking with serializerを経由する必要があります。

+0

実際に私は、データをシリアル化しています。使用する必要があるのは、呼び出すために作成するために、 'serializer.save()'でした。 – chefarov

+1

これ以上のものが必要です:呼び出しis_valid、保存、* NOT * validated_dataまたはsaveの結果)。 – Linovia

関連する問題