【发布时间】:2016-07-16 10:04:00
【问题描述】:
我一直在尝试找到一种方法来处理 DRF 中的一些上传数据(有或没有 Bulk),以使其与我的其他 API 保持一致并返回良好的结果,但似乎它可能比这是值得的。
系统处理来自外部系统的参考数据,外部系统不需要知道数据是如何存储的或那里已经存在什么。因此,要上传的 JSON 数据如下所示:
data = [
{"name": "foo", 'key': 'FOO', "resource_type": 'some-resource', 'team_tag': 'ABC1', 'properties': {"foo": "bar"}},
{"name": "foo2", 'key': 'FOO2', "resource_type": 'some-resource', 'team_tag': 'ABC2'}
]
正如您所见,没有 ID - key 和 resource_type 是唯一的元组(本质上是自然键)。系统应该根据这些是否已经存在来更新或创建。但是,由于以下假设,我遇到了问题:
- 正在更新或创建的所有资源(由于 POST/PUT/PATCH)
- 数据将具有“id”属性,并且似乎没有很好的入口点来更改对象的查询/键控方式
- 序列化程序的创建、验证和保存方式,尤其是关于它们是否要更新或创建。
我之前通过让 ViewSet 从数据库中删除所有相关对象来完成这项工作,然后 DRF 可以简单地插入新对象。这是一种低效的快速破解,并且不允许维护系统中的任何更改。
在尝试实现这一点时,似乎我重写了 ViewSets 和 Serializers 中的许多方法只是为了使其兼容,这比没有 DRF 时我至少需要的要多得多,但如果可能的话,我希望保持一致。
我也在 https://github.com/miki725/django-rest-framework-bulk/issues/30 遇到了这个问题并实施了他们的建议,但是遇到了其他问题,主要是因为他们使用了 bolkListSerializer 和自定义模型序列化器,这两者都需要被覆盖。
最后,我需要在视图中添加一些东西来删除或标记现在孤立的任何对象(不存在于外部)。
是否有一个已知的模式,这可以用于 DRF(B),还是我应该只写自己的独立视图?
谢谢!
【问题讨论】:
标签: json django rest django-rest-framework bulk-load