2016-11-19 22 views
1

我有一个标签问题,应该很容易,但很奇怪,我无法找到解决方法。Django:将关键别名声明为objects.filter函数

我有这个过滤功能

def search(cls, query): 
    return cls.objects.filter(label__icontains=query) 

而我的模型只是由一个键和一个标签字段组成。我得到这个样子的

[{"id": 20, "label": "Title 1"}, {"id": 22, "label": "Title 2"}] 

但我在输出使用的“名字”,而不是“标签”和“关键”,而不是“ID”的别名,像这样的希望只是:

[{"key": 20, "name": "Title 1"}, {"key": 22, "name": "Title 2"}] 

我怎样才能将这些别名直接声明到我的过滤函数中而无需在别处编码?

回答

1

您可以使用django的F表达式。

def search(cls, query): 
    qs = cls.objects.filter(label__icontains=query) 
    return qs.annotate(key=F('id'), name=F('label')).values('key', 'name') 

这样django基本上会生成一个查询SELECT id as key, label as name FROM ...

+0

哇,它工作的很棒!非常感谢,你已经度过了我的一天! –