【问题标题】:How to translate this this instructions in a query expression in Django如何在 Django 的查询表达式中翻译此指令
【发布时间】:2017-03-29 19:32:31
【问题描述】:

我有一组指令来查询我的数据库,我想知道这些指令是否可以以一种紧凑的方式作为查询表达式,所以我有一个模型,它有一个名为 solapin 的字段,如您在此处看到的:

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    ...
    solapin = models.CharField(max_length=250)

    def __str__(self):  # __unicode__ on Python 2
        return self.solapin

并且我想更改每个 Question 对象的 solapin 字段,其 solapin 具有 0 到 9 个字符,将每个人的 10 和当前 solapin 长度之间的差异添加为“0”字符你可以在这里看到:

from appname.models import Question

resultset = Question.objects.filter(solapin__iregex=r'^.{0,9}$')

for item in resultset: 
    diff = 10 - len(item.solapin)
    item.solapin = "0"*diff + item.solapin 
    item.save()

这对我来说非常有效,但我想看看是否可以改进它。

【问题讨论】:

  • 您可能需要重新格式化您的代码来帮助我们,因为缩进似乎存在问题,如果行尾没有分号会更好。
  • @quamrana : 抱歉,有分号,因为我在同一行中有所有说明
  • 好的,我想我可以看到你在做什么。第一个问题是:item.solapin = ... 行是否为solapin 分配了一个新字符串,它不再是CharField 是否重要?
  • @quamrana :给item.solapin 分配了一个字符串,如您所见,此操作"0"*diff + item.solapin 在末尾变成一个字符串,例如:当前solapin 之一我在我的数据库是456,所以它与我的查询匹配,这个变量diff7,所以"0"*7等于"0000000",所以最后item.solapin"0000000456"跨度>

标签: python django django-queryset


【解决方案1】:

您可以通过使用带有 django Func 的 postgres 重复函数和使用 LengthConcat 函数的单个查询来执行此操作:

from django.db.models import Func, Value, CharField, F
from django.db.models.functions import Length, Concat


Question.objects.annotate(len=Length('solapin')).filter(len__lt=10). \
annotate(
    zeroes=Func(
           Value('0', output_field=CharField()), 10 - F('len'),  
           function='repeat', output_field=CharField()
    ), 
    new_solapin=Concat(F('zeroes'),'solapin')
).update(solapin=F('new_solapin'))

【讨论】:

  • 感谢您的快速回答,但我正在尝试您的第一部分查询,但它不起作用Question.objects.filter(solapin__in=solapins),因为这只是找到与此列表匹配的solapin ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'] 和我需要所有 solapin 介于 0 到 9 个字符之间的 Question 对象,我有像这样的 45678964 具有 solapin 的 Question 对象,并且您的查询返回为空。
  • 然后,不要使用filter(solapin__in=solapins),而是使用在效率较低的版本中对您有用的相同过滤器:filter(solapin__iregex=r'^.{0,9}$')
  • 嗨@DimaKudosh 对不起我的延迟回答所以我执行了你的脚本并输出了这个错误:django.db.utils.OperationalError: no such function: repeat我不知道在 django 中是否有任何像这样命名的函数repeat 有吗?我正在使用 django 1.8。
  • 你使用什么数据库?
猜你喜欢
  • 2019-09-21
  • 2021-10-13
  • 1970-01-01
  • 1970-01-01
  • 2017-02-19
  • 2021-11-26
  • 1970-01-01
  • 2013-06-05
  • 2021-07-26
相关资源
最近更新 更多