簡體   English   中英

Postgres:使用django在json鍵上查詢值

[英]Postgres: values query on json key with django

我需要在django 1.10中的postgres支持的jsonfield上對嵌套鍵執行values / values_list查詢,例如。

class AbcModel(models.model):
    context = fields.JSONField()

如果它的值如下:

{
  'lev1': {
    'lev': 2
  }
}

我想運行像這樣的查詢

AbcModel.objects.values('context__lev1__lev2').distinct()
AbcModel.objects.values_list('context__lev1__lev2', flat=True).distinct()

編輯: JSON字段是來自django.contrib.postgres.fields的官方django JSONField

所以我找到了一個解決方案,這適用於django 1.10及以上版本。 我使用KeyTransform來注釋和提取nexted鍵,並在其上執行了values_list。

from django.contrib.postgres.fields.jsonb import KeyTransform
extracted_query = AbcModel.objects.annotate(lev1=KeyTransform('lev1', 'context')).annotate(lev2=KeyTransform('lev', 'lev1'))

此查詢允許我將lev1和lev2用作模型中的常規字段,因此我可以對字段執行值,values_list或任何其他有效查詢。

Django 1.11允許將兩個Transforms嵌套在一個annotate中,不確定關於嵌套的1.10,因為我已升級到1.11

它並不理想,但我能夠通過將json字段添加為額外字段然后在該額外字段上調用值來實現此功能:

AbcModel.objects.extra(select={
    "extra_field": "context->'lev1'->'lev2'"
}).values('extra_field').distinct()
AbcModel.objects.extra(select={
    "extra_field": "context->'lev1'->'lev2'"
}).values_list('extra_field', flat=True).distinct()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM