如何在Django的查询表达式中翻译此指令

时间:2017-03-29 19:32:31

标签: python django django-queryset

我有一组查询我的数据库的指令,我想知道这些是否可以以一种紧凑的方式作为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()

这对我来说非常有效,但我想知道是否有可能改善它。

1 个答案:

答案 0 :(得分:0)

您可以使用带有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'))