django - 如何使用 DRF 中的 API 调用创建多个模型实例(具有一对多关系)
问题描述
我有 2 个模型Product
,Watch
如下所示
class Product(models.Model):
id = models.CharField(max_length=255, primary_key=True)
# other fields
并且Watch
模型具有与模型product_id
连接的外键Product
class Watch(models.Model):
product_id = models.ForeignKey(
Product,
related_name='watches',
on_delete=models.CASCADE,
null=True,
)
# other fields
当我调用 API在请求正文中创建新watch
的时。product_id
我想检查product
with thatproduct_id
是否存在。如果没有,我同时创建一个新product
实例。
目前,我会create() method
像这样覆盖 in 序列化程序类
def create(self, validated_data):
product_id = validated_data['product_id']
is_product_exist = self.is_product_exist(product_id)
if (is_product_exist):
watch = Watch.objects.create(**watch_data)
else:
Product.objects.create(**product_data)
watch = Watch.objects.create(**watch_data)
return watch
但是在调用API时,我得到了错误
{"product_id":["Invalid pk \"57668290\" - object does not exist."]}
那么我该如何处理这个错误呢?感谢你们
解决方案
你可以使用 Django 的 get_or_create 方法,这要好得多。它返回对象和一个布尔值,指定它是被获取还是被创建
https://docs.djangoproject.com/en/3.1/ref/models/querysets/#get-or-create
def create(self, validated_data):
product_id = validated_data.pop('product_id',None)
if product_id is None:
# create an error to handle missing data here if you want to
raise serializers.ValidationError("You have to specify product id")
product, created_bool = Product.objects.get_or_create(id=product_id)
watch_data['product'] = product # not a mandotray row, assign the new product to the watch_data if you want to associate them
watch = Watch.objects.create(**watch_data)
return watch
推荐阅读
- android - MediaControllerCompat 的 PlaybackState
- libgdx - 毛衣效果着色器 Libgdx
- java - gradle 5 - windows java.io.IOException: CreateProcess 错误=206,文件名太长
- swift - 待办事项列表 - 显示项目计数的“正确细节”单元格样式
- batch-file - 通过批处理文件创建没有重复的元素集合
- android - 如何以编程方式在android中打开谷歌播放保护?
- visual-studio - vs c++ 错误列表 Lnk1104 .obj 带有奇怪的文件路径
- git - Git:即使在新克隆上也会出现“损坏的松散对象”
- javascript - 如何在反应状态挂钩上使用地图功能
- android - 如何获取 Clarifai 的 Android SDK?