【问题标题】:django-rest-framework (bulk): How to implement nonstandard bulk load update/createdjango-rest-framework (bulk): 如何实现非标准批量加载更新/创建
【发布时间】: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


    【解决方案1】:

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

    您可能希望改为使用常规序列化程序执行 [反] 序列化。见my post about that topic

    【讨论】:

    • 这并不完全准确,因为传入的数据确实与模型的属性匹配,但缺少与现有行匹配的 ID 属性。这就是它与通常模式的不同之处。
    • 我什至在我的 ViewSet 中添加了一部分以从现有行中添加 id(尽管这似乎效率低下),但它仍然以不同的方式失败,但似乎与我提到的 DRF ListSerializer 错误有关在我的帖子中,即github.com/miki725/django-rest-framework-bulk/issues/30 我已经开始研究一个简化的示例并遇到了同样的问题。
    猜你喜欢
    • 1970-01-01
    • 2014-02-21
    • 2014-07-10
    • 2018-02-05
    • 2018-06-02
    • 1970-01-01
    • 2020-11-11
    • 2018-01-08
    • 2022-06-17
    相关资源
    最近更新 更多