我的模型中有三个数字列,它们共同创建一个字符串,呈现给用户:
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)
现在我想要过滤该字符串(的一部分),所以说我有三个位置,010101
,010102
,010201
,我在0101
上过滤,我想只选择前两个。
我如何做到这一点,我查看了Q
个对象和available database functions,但我找不到解决方案。
答案 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)