首页 > 解决方案 > 使用 Django Rest Framework 同时更新或创建多个实例

问题描述

我正在从前端向 DRF API 发出 POST 请求。请求的格式如下:

[{name: 'foo', age: 16}, {name: 'bar', age: 12}]

正如格式所暗示的 - 发送了许多实例。DRF 现在应该获取每个实例并查看它是否已经存在于数据库中。如果它已经存在,则应更新实例,如果不存在,则应创建实例。Django 在模型管理器上有一个简洁的小函数 update_or_create。

我的问题是在哪里实现该逻辑以及如何访问经过验证的发布请求实例。这种逻辑在序列化程序的创建功能中是否最好?还是视图?

我尝试访问serializer.validated_datawhich is an OrderedDict- 这很难访问。我应该将此 OrderedDict 转换为普通字典,然后从数据库中单独查询每个项目吗?

标签: django-rest-framework

解决方案


您可以在序列化程序创建方法中编写此方法

class AbcSerializer(serializer.ModelSerializer):
   class Meta:
         model=Abc

   def create(self, validated_data):
       """ """

       items = Abc.objects.filterr(name__in=[data['name']for data in validated_data]).values("name", "age")
       new_record = list()
       update_record = list()
       hash_dict = dict() 
       for data in items:
           hash_dict[data['name']] = data
       for data in validated_data:
           if data['name'] in hash_dict:
            update_record.append(data)
         else:
           new_record.append(data)
       Abc.objects.bulk_create(new_record)
       for data in update_record:
          db_data = Abc.objects.get(**data)  
          db_data.age = data['age']
          db_data.save()



推荐阅读