Непоследовательное поведение фильтра «содержит» для jsonfield mysql / sqlite

#django #jsonfield

#django #jsonfield

Вопрос:

Я получаю противоречивые результаты в зависимости от серверной базы данных при использовании запросов jsonfield «contains».

 from polymorphic.models import PolymorphicModel
import jsonfield

class Action(PolymorphicModel):
    new_object = jsonfield.JSONField(null=True)
 

В другой модели я фильтрую по этому jsonfield, но получаю разные результаты.

На sqlilite работает следующее:

     return Action.objects.filter(
            new_object__contains={"ref_id": self.id}
        ).order_by("-created_at")[:5]
 

В mysql я должен сделать следующее:

     return Action.objects.filter(
            new_object__contains=f""ref_id": {self.id}"
        ).order_by("-created_at")[:5]
 

Итак, мне кажется, что в одной среде он десериализует json в dict, тогда как другой сохраняет его в виде строки..

У кого-нибудь есть хороший способ справиться с этим? Может ли быть проблема с одной из конфигураций, не совпадающих с базой данных?

Редактировать: это Django 2.2

Комментарии:

1. Начиная с Django-3.1, в MySQL он также использует JSONField. В ранних версиях a JsonField действительно было в большинстве баз данных просто a VARCHAR с сериализацией / десериализацией, выполняемой с помощью Django.

2. Я вижу, да, я в проекте Django 2.2. Знаете ли вы способ справиться с этим изящно, без необходимости изменять код для каждой среды?