【问题标题】:nested objects in Django rest frameworkDjango rest框架中的嵌套对象
【发布时间】:2020-11-07 23:27:46
【问题描述】:

我想设计订购商品的解决方案。我有创建订单的端点,但我需要在订单中有 items 对象。让我给你看代码

class ItemModel(models.Model):
    name = models.CharField(max_length=50)
    price = models.FloatField()
    discretion = models.CharField(max_length=500)
    available = models.BooleanField(default=True)

class OrderModel(models.Model):
    phone = models.CharField(max_length=20)
    delevary_time = models.DateTimeField()

class CartModel(models.Model):
    order = models.ForeignKey(OrderModel, on_delete=models.CASCADE, related_name='order_m')
    item = models.ForeignKey(ItemModel, on_delete=models.CASCADE, related_name='item_m')

我需要为我创建订单的端点。她我做了什么

class CartSerializer(serializers.ModelSerializer):
    class Meta:
        model = CartModel
        exclude = ['order',]
        depth = 2

class OrderSerializer(serializers.ModelSerializer):
    cart = serializers.SerializerMethodField()
    class Meta:
        model = OrderModel
        fields = ['phone', 'state', 'delevary_time', 'cart']

    def get_cart(self, obj):
        cart = CartModel.objects.filter(order__id=obj.id)
        serializer = CartSerializer(cart, many=True)
        return serializer.data

这是终点

      router.register('order', OrderViewSet, 'api-order')
{
    "phone": 124997988698,
    "delevary_time": "2020-07-17T19:34:00",
    "cart": [
        {
            "item": 1
        },
        {
            "item": 2
        }
    ]
}

当我发布 json 时,它不会保存购物车,它只会保存 oder 电话和 delevary_time。如何同时保存购物车

【问题讨论】:

  • 这是为了更好地为外键使用嵌套序列化程序,而不是SerializerMethodField,因为它是只读的
  • 怎么办?你能给我线索吗
  • 它给了我这个错误python Original exception text was: 'OrderModel' object has no attribute 'cart'.
  • 我发现它保存了模型,但在获取请求中出现了问题。我不知道方法!!.. 另外,在 Post 请求中它保存模型并显示错误消息

标签: django django-models django-rest-framework django-forms django-views


【解决方案1】:
class CartSerializer(serializers.ModelSerializer):
    class Meta:
        model = CartModel
        exclude = ['order',]
        depth = 2

class OrderSerializer(serializers.ModelSerializer):
    order_m = CartSerializer(many=True) # adding this
    class Meta:
        model = OrderModel
        fields = ['phone', 'state', 'delevary_time', 'order_m']
    
     def create(self, validated_data):
        cart_data = validated_data.pop('order_m')
        order = OrderModel.objects.create(**validated_data)
        for c in cart_data:
            CartModel.objects.create(order=order, **c)
        return order


【讨论】:

    猜你喜欢
    • 2014-05-21
    • 2019-06-14
    • 1970-01-01
    • 2012-11-02
    • 2016-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多