Django Rest框架可写嵌套序列化

2024-04-20 06:11:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我在serializer中使用了Writable Nested Serializer,并使用了create方法,如下所示:

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

这是我的观点:

class OrderViewSet(viewsets.ModelViewSet):

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

如何获取预期数据?你知道吗


Tags: nameidtruedefaultautodatamodelscreate
1条回答
网友
1楼 · 发布于 2024-04-20 06:11:52

使用计费作为外键解决了此问题: 在order模型中:

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

正如它所显示的:

IntegrityError at /api/orders/ (1048, "Column 'billing_id' cannot be null")

解决了我在OrderSerializer中更改create方法的问题:

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

相关问题 更多 >