过滤一些字段的计算表示

时间:2016-12-08 13:42:01

标签: python django filter

我的模型中有三个数字列,它们共同创建一个字符串,呈现给用户:

class Location(models.Model):
    aisle = models.PositiveIntegerField()
    rack = models.PositiveIntegerField()
    plank = models.PositiveIntegerField()

    def __unicode__(self):
         return "{a:02}{r:02}{p:02}".format(a=self.aisle, r=self.rack, p=self.plank)

现在我想要过滤该字符串(的一部分),所以说我有三个位置,010101010102010201,我在0101上过滤,我想只选择前两个。

我如何做到这一点,我查看了Q个对象和available database functions,但我找不到解决方案。

2 个答案:

答案 0 :(得分:1)

经过大量的实验,我设法使用Func

class LocationLabel(Func):
    function = 'CONCAT'
    template = '%(function)s(RIGHT(CONCAT(\'00\',%(expressions)s),2))'
    arg_joiner = '),2), RIGHT(CONCAT(\'00\','

models.Location.object.
   annotate(locationlabel=
        LocationLabel('aisle','rack','plank', output_field=CharField())
   ).
   filter(locationlabel__icontains=query)

答案 1 :(得分:0)

您无法对属性执行过滤,它必须位于字段上。 在这种情况下,我认为这将满足您的要求,因为 unicode 只是字段中格式化的实际整数值:

Location.objects.filter(aisle=1, rack=1)