django-rest-framework(bulk):如何实现非标准批量加载更新/创建

时间:2016-03-29 02:24:51

标签: json django rest django-rest-framework bulk-load

我一直试图找到一种方法来处理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的问题并实施了他们的建议,但遇到了其他问题,主要是他们使用两个 BulkListSerializer和一个自定义模型序列化器,这两者都需要要被覆盖。

最后,我需要在视图中添加一些内容来删除或标记现在孤立的任何对象(外部不存在)。

是否有一个已知的模式,这可以用于DRF(B),还是我应该写我自己的独立视图?

谢谢!

1 个答案:

答案 0 :(得分:0)

您似乎正在尝试将非模型数据与ModelSerializer一起使用。

您可能希望使用常规序列化程序执行[de]序列化。请参阅my post about that topic