Django ORM не может сгенерировать действительный sql для JSONb, содержитPython

Программы на Python
Anonymous
 Django ORM не может сгенерировать действительный sql для JSONb, содержит

Сообщение Anonymous »

начнем с ошибки из моих журналов:

Код: Выделить всё

2025-10-21 19:18:11,380 ERROR api.services.observium_port_status_service Error getting port status from store: invalid input syntax for type json
LINE 1: ..." WHERE "api_jsonstatestore"."filter_key_json" @> '''{"type"...
^
DETAIL:  Token "'" is invalid.
CONTEXT:  JSON data, line 1: '...
и запрос:

Код: Выделить всё

state = (
JsonStateStore.objects.select_for_update()
.filter(filter_key_json__contains={"type": "observium_port_status", "observium_port_id": observium_port_id})
.first()
)
вот пример записи



id
создан
тронут
filter_key_json
data_json




33
21 октября 2025 18:19:59.873 -0500
21.10.2025 18:44:57.047 -0500
{"type": "observium_port_status", "observium_port_id": 987
отредактировано



и модель:

Код: Выделить всё

class JsonStateStore(models.Model):
created = models.DateTimeField(auto_now_add=True)
touched = models.DateTimeField(auto_now=True)
filter_key_json = models.JSONField()
data_json = models.JSONField()

class Meta:
verbose_name = "JSON State Store"
verbose_name_plural = "JSON State Stores"

def __str__(self):
return f"JsonStateStore(key={self.filter_key_json}, created={self.created}, touched={self.touched})"

def save(self, *args, **kwargs):
self.touched = timezone.now()
super().save(*args, **kwargs)
Я использую django 4.2.2

моя база данных — timescale.db.backends.postgis (github | pypi), и я использую версию 0.2.13 этого пакета
Я не могу обнаружить синтаксическую ошибку в вызове QuerySet и не могу понять, что происходит не так здесь
Мой текущий обходной путь:

Код: Выделить всё

lock_sql = (
"""
SELECT id, created, touched, filter_key_json, data_json
FROM api_jsonstatestore
WHERE filter_key_json @> %s::jsonb
ORDER BY id ASC
LIMIT 1
FOR UPDATE
"""
)
payload = {"type": "observium_port_status", "observium_port_id": observium_port_id}
records = list(JsonStateStore.objects.raw(lock_sql, [json.dumps(payload)]))
state = records[0] if records else None
если кто-нибудь знает, почему метод ORM не работает, и хотел бы поделиться, я был бы признателен


Подробнее здесь: https://stackoverflow.com/questions/797 ... b-contains

Вернуться в «Python»