Django order_by на вложенном JSONField - PullRequest
0 голосов
/ 07 марта 2019

У меня JSONField на моей Product модели, и в этой модели у меня есть вложенные поля.

Например:

"data": {
    'products':{
            "name": "ProductA", 
            "color": "Brown", 
            "price": {
                "end_user": 54,
                "credit_cart": 60
            },
            "name": "ProductB", 
            "color": "Red", 
            "price": {
                "end_user": 100,
                "credit_cart":120
             },

     }
}

Я хочу заказать вложенный end_userполе.

это моя попытка:

Products.objects.order_by(RawSQL("data->>%s", ("data__price__end_user",)))

Я нашел ответ:

queryset = queryset.annotate(
                end_user=RawSQL("data->'products'->'price'->'->'end_user'", [])
            ).order_by('end_user')

Ответы [ 2 ]

0 голосов
/ 07 марта 2019

Это работа?

from django.db.models.expressions import RawSQL
RatebookDataEntry.objects.all().order_by(RawSQL("data->>%s", ("data__products__price__end_user",)))

Или как насчет этого:

entries = RatebookDataEntry.objects.all()
ordered_entries = sorted(entries, key=lambda x: x['data']['products']['price']['end_user'])
0 голосов
/ 07 марта 2019

Похоже, что это возможно, поскольку Django 1.11 использует KeyTextTransform

Джанго => 1,11

from django.contrib.postgres.fields.jsonb import KeyTextTransform

qs = RatebookEntry.objects.all()
qs = qs.annotate(manufacturer_name=KeyTextTransform('manufacturer_name', 'data'))
qs = qs.order_by('manufacturer_name')
# or...
qs = qs.order_by('-manufacturer_name')

Джанго <1,11 </p>

from django.contrib.postgres.fields.jsonb import KeyTransform

class KeyTextTransform(KeyTransform):
    operator = '->>'
    nested_operator = '#>>'
    _output_field = TextField()

Источник: https://stackoverflow.com/a/50046631/3345051

Новая реализация (2.1): https://code.djangoproject.com/ticket/24747

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...