2017-03-29 18 views
0

私はデータベースに保存するためにJsonレスポンスを取得していますが、line_itemsオブジェクトを取得する必要があります。モデルのline_items属性を削除すると、シリアライザとビューが正常に動作しますが、そのオブジェクトを取得してデータベースに保存しようとすると何も起こりません。私はシリアライザで何かを見逃しているのでしょうか?ネストされたオブジェクトをdjango rest frameworkにシリアライザで保存します

JSON構造:

{ 
    "id": 123456, 
    "email": "[email protected]", 
    "created_at": "2017-03-29T15:56:48-04:00", 
    "line_items": [ 
     { 
      "id": 56789, 
      "title": "Aviator sunglasses", 
      "quantity": 1 
     }, 

    { 
     "id": 98765, 
     "title": "Mid-century lounger", 
     "quantity": 1 
    } 

    ] 
} 

マイモデル:

class Line(models.Model): 
    title = models.CharField(max_length=100) 
    quantity = models.IntegerField() 


class Order(models.Model): 
    name = models.CharField(max_length=255) 
    created_at = models.DateTimeField() 
    total_price = models.DecimalField(max_digits=6,decimal_places=2) 
    line_items = models.ForeignKey(Line) 

マイシリアライザ:

class OrderSerializer(ModelSerializer): 
    class Meta: 
     model = Order 
     fields = '__all__' 

マイビュー:

@api_view(['POST']) 
def orders(request): 
    if request.method == 'POST': 
     json_str = json.dumps(request.data) 
     resp = json.loads(json_str) 
     serializer = OrderSerializer(data=request.data) 
     if serializer.is_valid(): 
      serializer.save() 
     return Response(serializer.data, status=status.HTTP_200_OK) 

答えて

0

OrderSerializerに明示的なline_itemsフィールドを追加する必要があると思います。このように:

class OrderSerializer(ModelSerializer): 
    line_items = LineSerializer(many=True) 
    class Meta: 
     model = Order 
     fields = '__all__' 
+0

感謝。うまくいきませんでした、私はそれがメソッドの作成で何かになると思います。 – dfrojas

+0

line_itemsは投稿内のリストですが、モデル内の外部キーです。私はそれがManyToManyFieldであるべきだと思います – Guinner

0

シリアライザに深度= 1を追加するだけです。それはあなたがテーブル内のデータを収容することはできませんあなたのモデルごとにあなたは、あなたの応答フィールドキーline_items内のリストを持っている

class OrderSerializer(ModelSerializer): 

    class Meta: 
     depth = 1 
     fields = '__all__' 
1

をDO-ます、あなたが必要なものOrderLineManyToMany関係でありますお返事のため、

class Order(models.Model): 
    name = models.CharField(max_length=255) 
    created_at = models.DateTimeField() 
    total_price = models.DecimalField(max_digits=6,decimal_places=2) 
    line_items = models.ManyToManyField(Line) 

とあなたのシリアライザで、

class OrderSerializer(ModelSerializer): 
    class Meta: 
     model = Order 
     fields = [f.name for f in model._meta.fields] + ['line_items'] 

    def create(self, validated_data): 
     line_items = validated_data.pop('line_items') 
     instance = super(OrderSerializer, self).create(validated_data) 
     for item in line_items: 
      instance.line_items.add(item['id') 
     instance.save() 
     return instance 
関連する問題