0

Ich habe Writable Nested Serializer in meinem serializer verwendet und verwendet create Methode wie folgt:Django Übriges Framwork Beschreibbare Serialisierung Verschachtelte

class OrderSerializer(serializers.ModelSerializer): 
    billing = BillingSerializer() 

    class Meta: 
     model = Order 
     fields = '__all__' 

    def create(self, validated_data): 
     billing_data = validated_data.pop('billing') 
     order = Order.objects.create(**validated_data) 
     Billing.objects.create(**billing_data) 
     return order 

I verschachtelten Daten erstellen können. aber wenn ich eine Ansicht erhalte, sieht es so aus:

{ 
     "id": 1, 
     "billing": {}, 
     "quantity": 3, 
     "delivery_date": "2017-01-27T15:44:40Z", 
     "base_rate": "90.00", 
     "is_delivered": false, 
     "created_at": "2017-01-26T07:26:53.194450Z", 
     "updated_at": "2017-01-26T07:26:53.194495Z", 
     "user_id": 1 
    } 

Leere Dict für die Abrechnung. Meine Modelle sind wie folgt:

class Billing(models.Model): 
    paid_status = models.BooleanField(default=False) 
    total_billed = models.DecimalField(default=90.00, max_digits=6, decimal_places=2) 
    created_at = models.DateTimeField(auto_now_add=True) 
    updated_at = models.DateTimeField(auto_now=True) 

    class Meta: 
     ordering = ('created_at',) 
     verbose_name = 'Billing' 
     verbose_name_plural = 'Billings' 

class Order(models.Model): 
    user_id = models.ForeignKey('auth.User', related_name='orders', on_delete=models.CASCADE) 
    quantity = models.PositiveIntegerField(validators=[MaxValueValidator(10)]) 
    delivery_date = models.DateTimeField(default=datetime.now()+timedelta(days=1)) 
    base_rate = models.DecimalField(default=90.00, max_digits=6, decimal_places=2) 
    is_delivered = models.BooleanField(default=False) 
    created_at = models.DateTimeField(auto_now_add=True) 
    updated_at = models.DateTimeField(auto_now=True) 
    billing = models.TextField() 

    class Meta: 
     ordering = ('created_at',) 
     verbose_name = 'Order' 
     verbose_name_plural = 'Orders' 

    def __str__(self): 
     return self.id 

Hier ist meine oderView:

class OrderViewSet(viewsets.ModelViewSet): 

    queryset = Order.objects.all() 
    serializer_class = OrderSerializer 
    permission_classes = (permissions.IsAuthenticated, permissions.IsAdminUser,) 

Wie kann ich meine erwarteten Daten?

+1

Sie haben 'billing' Feld als TextField in Modelldefinition, definieren Sie es mit ForeignKey neu. Dies sollte funktionieren –

+0

filling = models.ForeignKey ('Billing')? – mimic

+0

IntegrityError um/api/orders/ (1048, "Spalte 'billing_id' kann nicht null sein") – mimic

Antwort

0

Dieses Problem wurde gelöst, indem die Abrechnung als foreignKey: in order Modell:

billing = models.ForeignKey(Billing, related_name='orders', on_delete=models.CASCADE) 

Wie es zeigte:

IntegrityError bei/api/Bestellungen/(1048, „Spalte‚BILLING_ID 'kann nicht sein null ")

Es wurde meine wechselnde erstellen Methode in gelöst OrderSerializer:

def create(self, validated_data): 
    billing_data = validated_data.pop('billing') 
    billing = Billing.objects.create(**billing_data) 
    billing.save() 
    order = Order.objects.create(billing_id=billing.id, **validated_data) 
    return order 
Verwandte Themen