首页 > 解决方案 > 在序列化程序 Django Rest Framework 中通过 id 传递模型实例

问题描述

当我在邮递员中发布 product_id 时,我得到了这个结果

{
    "id": 13,
    "user": 26,
    "product": null,
    "quantity": 1
}

哪个产品为空,但我不想要这个。

我的序列化器看起来像这样

class CartSerializer(serializers.ModelSerializer):

    product = ProductSerializer(required=False)

    class Meta:
        model = Cart
        fields = ['id', 'user', 'product', 'quantity']

    def create(self, validated_data):
        return Cart.objects.create(**validated_data)

我从管理员将产品添加到购物车我得到了这个

{
            "id": 7,
            "user": 26,
            "product": {
                "id": 8,
                "name": "Apple Watch 4 series",
                "brand": "Apple",
                "color": {
                    "id": 1,
                    "color": "Black"
                },
                "price": "250.00",
                "discount": 2,
                "images": [
                    {
                        "id": 6,
                        "product": 8,
                        "image": "http://localhost:8000/media/products/2019/12/09/b_Amazfit_Bip.jpg"
                    }
                ],
                "slug": "apple-watch-4-series"
            },
            "quantity": 1

这正是我想要的,但我不能覆盖序列化器方法。我怎样才能做到这一点?如果我发布产品 ID,我应该得到上面显示的结果。提前致谢!

标签: djangopython-3.xdjango-rest-framework

解决方案


在 Django 中,任何外键都保存为_id附加为您声明的字段名称的后缀。但是当您向某些 API 发送一些数据时,您应该使用它而不使用_idpost fix。你应该product从邮递员那里使用。序列化器只获取在序列化器元类中声明的字段。由于您的product字段是可选的,因此您的序列化程序不会给出任何错误。所以这就是为什么你得到你productnull回应。如果你想在product_id字段而不是product字段中发送数据,你应该像这样改变你的序列化器。

class CartSerializer(serializers.ModelSerializer):

    product_id = serializer.IntegerField(required=False)

    class Meta:
        model = Cart
        fields = ['id', 'user', 'product_id', 'quantity']

    def create(self, validated_data):
        return Cart.objects.create(**validated_data)

    def to_representation(self, validated_data):
        data = super().to_representation(validated_data)
        data.update({'product': ProductSerializer(instance.product).data})
        return data

推荐阅读