django-rest-framework - 使用 Django Rest Framework 同时更新或创建多个实例
问题描述
我正在从前端向 DRF API 发出 POST 请求。请求的格式如下:
[{name: 'foo', age: 16}, {name: 'bar', age: 12}]
正如格式所暗示的 - 发送了许多实例。DRF 现在应该获取每个实例并查看它是否已经存在于数据库中。如果它已经存在,则应更新实例,如果不存在,则应创建实例。Django 在模型管理器上有一个简洁的小函数 update_or_create。
我的问题是在哪里实现该逻辑以及如何访问经过验证的发布请求实例。这种逻辑在序列化程序的创建功能中是否最好?还是视图?
我尝试访问serializer.validated_data
which is an OrderedDict
- 这很难访问。我应该将此 OrderedDict 转换为普通字典,然后从数据库中单独查询每个项目吗?
解决方案
您可以在序列化程序创建方法中编写此方法
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()
推荐阅读
- python - 更新大批量推文
- pattern-matching - Ocaml中相同类型和匹配的多个名称
- c# - 如何在 C# Web API 中一次限制单个用户 GET/POST 请求
- git - 在未安装 git 的情况下下载 Github 存储库
- git - 想要从生产分支刷新/复制沙箱分支
- arduino - “;”之前的预期构造函数、析构函数或类型转换 令牌
- python - 反序列化 spacy 的对象 [python]
- flutter - Flutter - 文本中的连字符处没有换行符
- python - 在完全不同的目录中导入 python 模块
- mysql - CREATE TABLE `table` AS SELECT 忽略?