Django postgres HStoreField命令

时间:2015-06-11 07:54:55

标签: django postgresql

我可以通过HStoreField中的值来排序QuerySet的结果,例如我有模型:

class Product(model.Models):
    name = CharField(max_length=100)
    properties = HStoreField()

我想在HStoreField中存储我的产品的一些属性,如:

{ 'discount': '10', 'color': 'white'}

在视图中我想通过折扣来订购生成的QuerySet。

2 个答案:

答案 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键作为单独的列提取并将其转换为整数。