【问题标题】:Django Rest Framework: Disable save in updateDjango Rest Framework:禁用更新中的保存
【发布时间】:2021-10-06 10:29:52
【问题描述】:

这是我的第一个问题,在阅读了类似的问题后我没有找到我需要的东西,谢谢你的帮助。

我正在创建一个相当简单的 API,但我想在安全级别使用最佳实践。

要求:SQL Server 中有一个包含 +500 万条记录的表,我应该只允许 READ(所有字段)和 UPDATE(一个字段)。这样数据科学家就可以使用该表中的数据,并通过预测模型(我认为)可以为每条记录分配一个值。

为此,我主要需要两件事:

  1. 尽管在 Json 中发送了表的所有字段,但只有一个字段被更新(我想我已经用我的序列化器实现了它)。

  2. 而且,我遇到的问题是,在更新不存在的记录时禁用新记录的创建。

我正在使用 UpdateAPIView 来允许尝试使用这样的 json 进行批量更新(subrrogate_key 在我的表中,我使用 lookup_field 来:

[
    {
        "subrrogate_key": "A1",
        "class": "A"
    },
   {
        "subrrogate_key": "A2",
        "class": "B"
    },
   {
        "subrrogate_key": "A3",
        "class": "C"
    },
]

当使用 partial_update 方法时,使用 update 和这个 perform_update,最后调用 save 并且默认操作是如果没有找到主键(或在 lookup_field 中指定的主键)插入一条新记录。

如果我覆盖它们,我怎样才能使新记录不被插入,并且只更新存在的字段?

我试过了:

Model.objects.filter (subrrogate_key = ['subrrogate_key'])。更新(class= ['class])

Model.objects.update_or_create (...)

如果 Json 中的所有键都存在,它们可以正常工作,因为如果有新键,它们会插入(我不想要这个)。

附:抱歉,我使用翻译器。

【问题讨论】:

  • filter().update() 不起作用?
  • 您能分享一下您的看法吗?
  • bdbd 我会用我的视图更新,但是如果没有找到 pk/key,filter().update() 会插入新记录

标签: django django-rest-framework


【解决方案1】:

Django 通过在save() 期间使用force_updateupdate_fields 来实现该功能。

在极少数情况下,有必要能够强制 save() 方法来执行 SQL INSERT 而不是回退到执行 更新。反之亦然:如果可能,更新,但不插入新行。 在这些情况下,您可以传递 force_insert=True 或 force_update=True save() 方法的参数。

model_obj.save(force_update=True)

model_obj.save(update_fields=['field1', 'field2'])

【讨论】:

    【解决方案2】:

    perform_update 如果您传递了一个没有实例的序列化程序,将创建一个新记录。根据您编写视图的方式,您可以在perform_update 中调用save 之前简单地检查序列化程序中是否存在实例,以防止创建新记录:

        def perform_update(self, serializer):
            if not serializer.instance:
                return
            serializer.save()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-24
      • 2014-04-03
      • 1970-01-01
      • 1970-01-01
      • 2017-04-27
      • 2017-08-15
      • 2015-09-19
      • 2016-01-09
      相关资源
      最近更新 更多