首页 > 解决方案 > 如何使用 DRF 中的 API 调用创建多个模型实例(具有一对多关系)

问题描述

我有 2 个模型ProductWatch如下所示

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我想检查productwith 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."]}

那么我该如何处理这个错误呢?感谢你们

标签: djangodjango-modelsdjango-rest-framework

解决方案


你可以使用 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

推荐阅读