我可以通过HStoreField中的值来排序QuerySet的结果,例如我有模型:
class Product(model.Models):
name = CharField(max_length=100)
properties = HStoreField()
我想在HStoreField中存储我的产品的一些属性,如:
{ 'discount': '10', 'color': 'white'}
在视图中我想通过折扣来订购生成的QuerySet。
答案 0 :(得分:4)
上述答案无效。从未对HStoreField
实施订单转换,请参阅https://code.djangoproject.com/ticket/24747。
但https://code.djangoproject.com/ticket/24592中的建议有效。这是一些更详细的信息。
from django.contrib.gis.db.models import TextField, HStoreField, Model
from django.db.models import F, Func, Value
class MyThing(Model):
name: TextField()
keys: HStoreField()
things = [MyThing(name='foo'),
MyThing(name='bar'),
MyThing(name='baz')]
things[0].keys['movie'] = 'Jaws'
things[1].keys['movie'] = 'Psycho'
things[2].keys['movie'] = 'The Birds'
things[0].keys['rating'] = 5
things[1].keys['rating'] = 4
things[2].keys['year'] = '1963'
# Informal search
MyThing.objects\
.filter(keys__has_key='rating')\
.order_by(Func(F('keys'), Value('movie'),
function='',
arg_joiner=' -> ',
output_field=TextField()))
正式搜索完全如上面第二个链接所述。将上述代码段中的导入与该代码一起使用。
答案 1 :(得分:0)
这可能有效(我现在无法测试):
.order_by("properties -> 'discount'")
但请注意,HSTORE值是字符串,因此您不会获得数字顺序,而是将项目排序为字符串。
要获得正确的数字顺序,您应该将properties->discount
键作为单独的列提取并将其转换为整数。