【问题标题】:Django: How do I update only ONE record in my database?Django:如何只更新数据库中的一条记录?
【发布时间】:2020-01-27 19:32:20
【问题描述】:

我在尝试更新数据库中的单个(记录)对象时遇到了很多麻烦。

context['eval_list'] = Evaluering.objects.update(eval_relationer_id=self.kwargs.get('pk'))

我使用objects.update,但它会更新我所有的对象fk。如何实现只更新一个对象?我也试过这个:

context['eval_list'] = Evaluering.objects.update_or_create(eval_relationer_id=self.kwargs.get('pk'))

但这会创建一个新对象并且不会更新我要更新的记录。我知道它为什么会创建一个新对象,这是因为我要更新的 FK 为空。当然,必须有一种只更新而不创建单个记录的方法吗?我在这里想念什么?

我尝试添加过滤器,但感觉多余?我试过这个:

context['eval_list'] = Evaluering.objects.filter(eval_relationer_id=self.kwargs.get('pk')).update(eval_relationer_id=self.kwargs.get('pk'))

我确实考虑过尝试立即而不是稍后创建 FK 的 ID,但我无法真正让它工作,但如果我创建了一个 ID,那么 update_or_create 将工作,因为一个 ID 已经存在,但是我不敢相信不创建就无法更新单个对象

如果之前创建 ID 是唯一的解决方法,我将不得不弄清楚如何。

【问题讨论】:

  • 过滤不会做任何事情,因为您使用已经具有该值的值更新项目。通常过滤条件与更新不同

标签: sql django django-models django-rest-framework django-views


【解决方案1】:

MyModel.objects.filter(pk=some_value).update(field1='some value')

过滤器获取您的对象(返回仅包含该对象的 Queryset),然后更新将不是 PK 的其他字段更改为您想要的任何内容。

在你的情况下可能是这样的:

context['eval_list'] = Evaluering.objects.filter(eval_relationer_id=self.kwargs.get('pk')).update(some_attribute='some value')

【讨论】:

  • 嗯,它是表中的外键,所以我不确定过滤器应该是什么样子。 fk 被称为: eval_relationer 所以我会考虑做这样的事情吗? context['eval_list'] = Evaluering.objects.filter(eval_relationer=self.kwargs.get('id')).update(eval_relationer=self.kwargs.get('id')) 但是,这无济于事。尝试使用 get('pk') 代替,但也没有。
  • filter(eval_relationer_id=self.kwargs.get('pk')) 很有道理,我似乎无法弄清楚如何使用已生成的 ID 更新 FK。
  • 如果您正在过滤 FK,您需要已经创建了其他对象 - 否则您将返回 None,因为过滤器找不到它(因为它没有不存在)。如何/何时创建 FK 完全是另一个问题 - 但要获取单个对象,您运行 .filter 来获取它,然后使用 .update 进行您需要做的任何更改。
  • 是的,我明白,并且正在创建 FK 对象,没有使用更新过滤器,我可以得到我想要的 fk,但它会将所有对象 fk 更改为相同的 fk,因为它正在更新所有这些,而不是使用过滤器。但我无法让它与过滤器一起工作 -> 更新...无法在更新部分找出正确的查询。
  • 因为.update 不是查询,也不查询事物。 .update 用于更新您使用过滤器检索的对象的特定属性。您可以分两步执行此操作(也许这对您更有意义)...temp = Model.objects.filter(eval_id=some_value)(如果它是 FK,则理想情况下返回 1 个对象),然后您将执行类似temp.update(attribute_i_want_to_change='some value') 之类的操作...更新命令根本不做任何查询 - 只更新。
【解决方案2】:

在@Hanny 的帮助下,我发现出了问题。

我试图按 eval_relationer_id 进行过滤,而我本应按评估 pk 进行过滤并获得特定的 PK。否则我会更新所有不是我想要的值。

所以通过pk过滤:

filter(pk=self.kwargs.get('pk'))

并通过我要更新的属性 / fk 进行更新

update(eval_relationer_id=self.kwargs.get('pk'))

这是最终结果:

context['eval_list'] = Evaluering.objects.filter(pk=self.kwargs.get('pk')).update(eval_relationer_id=self.kwargs.get('pk'))

【讨论】:

  • 请注意:如果有人为您提供了有效的答案 - 通常最好的做法是将他们的答案标记为正确答案。例如:根据给出的信息,我的答案是正确的,应该这样标记。创建您自己的答案并将其标记为已接受的答案只是额外的步骤,在您的情况下可能对其他人没有帮助,因为原始答案下方的 cmets 中的对话提供了您的答案所没有的额外见解。
  • 哦,好吧..对不起,我不知道。我只是想清楚地解释一下我在你的帮助下做了什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-17
  • 2022-11-02
  • 2013-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多