django - 在序列化程序 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,我应该得到上面显示的结果。提前致谢!
解决方案
在 Django 中,任何外键都保存为_id
附加为您声明的字段名称的后缀。但是当您向某些 API 发送一些数据时,您应该使用它而不使用_id
post fix。你应该product
从邮递员那里使用。序列化器只获取在序列化器元类中声明的字段。由于您的product
字段是可选的,因此您的序列化程序不会给出任何错误。所以这就是为什么你得到你product
的null
回应。如果你想在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
推荐阅读
- c++ - 来自 Ubuntu 21.10 的 GCC 11.2 和 Compiler Explorer 中的版本为用作迭代集合的 C 字符串产生不同的输出
- google-cloud-platform - 哪个是运行需要几天时间的预定 docker 容器的最佳服务?
- docker - 在 Docker 中创建 Kafka 主题可以通过命令行而不是 Shell 脚本文件工作
- python - 如何根据列 dtype 创建不同图的组
- html - CSS 剪辑路径不使用 path() 拉伸
- javascript - useEffect hook:如果一个值更新,是否保证清理函数在其效果函数之前同步运行?
- flask - Jinja2如何格式化带有千位分隔符的数字并四舍五入到两位数?
- css - Streamlit:更改多选小部件的颜色
- python - 使用迭代器的可调用对象的名称?
- android - 特定 URL 未在 Android Webview 中呈现