我有一组查询我的数据库的指令,我想知道这些是否可以以一种紧凑的方式作为Query表达式,所以我有一个模型,其中有一个名为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
我想更改solapin
在0到9个字符之间的每个问题对象的solapin
字段,添加为' 0'字符为10与当前solapin
长度之间的差异,如您所见:
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()
这对我来说非常有效,但我想知道是否有可能改善它。
答案 0 :(得分:0)
您可以使用带有django Func的postgres重复功能并使用Length和Concat函数进行单一查询:
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'))