【问题标题】:Django Rest Framwork Writable Nested serializationDjango Rest Framework 可写嵌套序列化
【发布时间】:2017-01-26 07:42:28
【问题描述】:

我在我的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

这是我的 oderView:

class OrderViewSet(viewsets.ModelViewSet):

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

我怎样才能得到我的预期数据?

【问题讨论】:

  • 你在模型定义中有billing字段作为TextField,用ForeignKey重新定义它。这应该工作
  • billing = models.ForeignKey('Billing') ?
  • IntegrityError at /api/orders/ (1048, "Column 'billing_id' cannot be null")

标签: python django serialization django-models django-rest-framework


【解决方案1】:

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

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

正如它所显示的那样:

IntegrityError at /api/orders/ (1048, "列 'billing_id' 不能 空")

解决了我在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

【讨论】:

    猜你喜欢
    • 2015-03-20
    • 1970-01-01
    • 2023-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-10
    • 2016-05-29
    相关资源
    最近更新 更多