【问题标题】:F() expressions in django keeps giving me 0django 中的 F() 表达式一直给我 0
【发布时间】:2018-10-29 22:41:50
【问题描述】:

我即将为我的django 模型之一更新大约 2-3k 条记录。 我知道使用update() 会有所帮助,但是因为我实际上在该字段中使用了相同的值并将其更改为其他内容,例如具有对现有字段进行整理的功能。

我认为有一个名为 F() 的东西应该能够帮助我解决它,但不知何故,它一直将我的值作为 0 保存到字段中。

我没有收到任何错误,也不知道在哪里查看。

这是我阅读的教程 https://docs.djangoproject.com/en/1.8/ref/models/expressions/

这是我在真正对 2-3k 记录进行批量更新之前的示例代码

# I used the below, gives me 0 when I look at my db
querysets_of_model = Model.objects.filter(id__in[111, 123]).update(name=F('name') + ' testing')

# this gives me 0 too
querysets = Model.objects.filter(id__in[111,123])
querysets.update(name=F('name') + ' testing')

# without using the F(), which of course gives me `testing only` in the name field
qs = Model.objects.filter(id__in[111, 123]).update(name='testing only')

我本来想做的就是这样的

qys = Model.objects.filter().update(name=scrumble_fun(F('name')))

scrumble_fun 只是一个对现有值进行排序然后返回排序后的值并保存它的函数。

当然,在这样做之前,我作为前两个示例做了只是取出两个查询集并进行测试以确保我做对了。但好像我不是? :(

提前感谢您的任何帮助。

附:如果可能的话,循环遍历每个查询集然后 save() 不是我想要的方式。

【问题讨论】:

  • 这可能对你有帮助:stackoverflow.com/questions/3300944/…
  • @T.Tokic 我想要的实际上是尝试取出原始值,在函数中对其进行处理,然后将其保存回原始字段。而不仅仅是concating

标签: python django orm sql-update


【解决方案1】:

这行得通吗?

querysets = Model.objects.filter(id__in[111, 123])
querysets.name = F('name') + ' testing'
querysets.save()

【讨论】:

  • 给我'QuerySet' object has no attribute 'save'
  • @Dora 哦。只需循环运行它们并保存每个。
  • 我应该注意到,如果我不必这样做,那不是我想做的方式:|让我重新编辑我的问题
  • 试试这个。 from django.db.models import Value; from django.db.models.functions import Concat; querysets.update(name=Concat('name', Value('test')))
  • 不走运 :( p.update(name=Concat('name', Value(' does this work'))) 实际上甚至没有改变任何东西。也没有错误
猜你喜欢
  • 1970-01-01
  • 2019-10-21
  • 2015-08-05
  • 2016-02-13
  • 2014-02-21
  • 1970-01-01
  • 2020-12-25
  • 2019-05-03
  • 2018-02-12
相关资源
最近更新 更多