Сложная фильтрация Django Model на основе массива внутри JSONField
Я прочитал все вопросы, которые имели хоть какое-то отношение к тому, что я пытаюсь достичь, но все еще не повезло. Единственный, который немного помог мне, это этот Как фильтровать JSON массив в Django JSONField, но мне все еще нужно что-то дополнительное.
Мне нужно вернуть профили, которые предоставляют определенную услугу (отфильтрованную по service_id) в определенном ценовом диапазоне.
Это модель:
class Profile(models.Model):
tagline = models.CharField(null=True, blank=True, max_length=40)
experience_years = models.IntegerField(null=True)
experience_description = models.CharField(null=True, blank=True, max_length=500)
services_offered = models.JSONField(null=True)
атрибут services_offered
имеет массив объектов JSON, как это:
"services_offered": [
{
"noOfPets": 1,
"hasDogWalk": "N",
"pricePerPet": 27,
"petServiceId": "2",
},
{
"noOfPets": 1,
"hasDogWalk": "N",
"pricePerPet": 30,
"petServiceId": "1",
},
]
Я могу отфильтровать профили, предлагающие определенную услугу (здесь не используется цена), следующим образом:
Profile.objects.filter(services_offered__contains=[{'petServiceId': query_params['service_id']})
Но как я могу отфильтровать профили, которые предлагают определенную услугу в определенном ценовом диапазоне? Другими словами, мне нужно найти JSON объект этой услуги по ID, а затем проверить цену (используя lte и gte) для этой услуги.
Я тоже пробовал, но ничего не возвращается (price_max была установлена очень высокой, на всякий случай):
Profile.objects.filter(Q(services_offered__petServiceId=query_params['service_id'], services_offered__pricePerPet__lte=int(query_params['price_max'])))
Даже это ничего не возвращает:
Profile.objects.filter(Q(services_offered__petServiceId=query_params['service_id']))