2017-03-29 1 views
0

Ich bekomme eine JSON-Antwort, um es in meiner Datenbank zu speichern, muss ich die Elemente in line_items Objekt. Mein Serializer und View funktioniert gut, wenn ich das Attribut line_items im Modell entferne, aber wenn ich versuche, dieses Objekt zu bekommen und es in der Datenbank zu speichern, passiert nichts. Vielleicht fehlt mir etwas in meinem Serializer?Speichern verschachtelten Objekts mit Serializer in Django Rest Framework

Json Struktur:

{ 
    "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 
    } 

    ] 
} 

Mein Modell:

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) 

Mein Serializer:

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

Meine Ansicht:

@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) 

Antwort

0

Ich denke, Sie sollten ein explizites Feld line_items zu OrderSerializer hinzufügen. Gefällt mir:

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

dank für Ihre Antwort. Hat nicht funktioniert, ich denke das wäre etwas mit der Methode erstellen. – dfrojas

+0

line_items ist eine Liste im Post, aber ein Fremdschlüssel im Modell. Ich denke, es sollte ein ManyToManyField sein – Guinner

0

Fügen Sie in Ihrem Serializer einfach depth = 1 hinzu. Es wird

class OrderSerializer(ModelSerializer): 

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

Sie haben eine Liste in das Feld Schlüssel line_items in Ihrer Antwort do-, wie pro Ihre Modelle, die Sie nicht auf die Daten in den Tabellen aufnehmen kann, was Sie brauchen, ist ManyToMany Beziehung zwischen Order und Line ,

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) 

und in Ihrem Serializer

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 
Verwandte Themen