0

私は私のserializerWritable Nested Serializerを使用して、このようなcreate方法を使用している:私は、ネストされたデータを作成することができますジャンゴ休憩Framwork書き込み可能な入れ子シリアライズ

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 

を。

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

請求のための空の辞書:私はビューを得るとき、それはこのように表示されます。次のように私のモデルは以下のとおりです。ここで

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 

は私oderViewです:

class OrderViewSet(viewsets.ModelViewSet): 

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

は、どのように私は私の予想データを得ることができますか?

+1

モデル定義でTextFieldとして 'billing'フィールドがあり、それをForeignKeyで再定義します。これは動作するはずです –

+0

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

+0

IntegrityError at/api/orders/ (1048、「 'billing_id'列はnullにはできません) – mimic

答えて

0

この問題は、FOREIGNKEYとして課金を使用して解決した: orderでモデル:

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

それは見せていたとおり:

IntegrityErrorをAPI /オーダー/(1048年、「列「/でBILLING_ID ' nullにはできません)

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 
関連する問題