Преобразование данных JSON в структурированные данные в базе данных SQL с помощью Django ORM

Я создаю чат-бота, используя Django с серверной частью MySQL. У меня есть модель ChatSession, которая представляет всю полезную информацию, которая будет сохранена после окончания сеанса чата.

Теперь у него есть поле JSON с именем cc_data (реализовано с использованием django-jsonfield)

Вот пример содержимого этого поля:

{
  "slots":{
    "chal_tech":"What is the Proof",
    "nats":["I will fail the course","Nobody likes me"],
    "distortion":"Jumping to Conclusions",
    "user_name":"parth",
  }
}

Недавно я понял, что мне нужно запросить некоторые поля в этом словаре slots. Примером запроса может быть список всех nats за последние 10 сеансов чата.

Кажется, что чтение всех значений JSON в dicts, а затем поиск/манипулирование ими было бы неэффективным. Поэтому я стремился преобразовать это представление JSON в модели Django ORM (SQL).

Однако при попытке сделать это я столкнулся с проблемой. Число "ключей" словаря slots, вероятно, конечно, но я не знаю точно, сколько из них потребуется на данный момент. В любом случае это будет большое количество (около 50-100).

  • Ручное написание классов модели для такого количества атрибутов в models.py кажется неэффективным, а также немного повторяющимся (большинство из них будет просто иметь один JSONfield или TextField). Даже с абстрактными моделями мне все равно пришлось бы перечислять классы для всех «ключей» в файле models.py.
  • В идеале я хотел бы создавать классы моделей для любых новых «ключей» автоматически и «на лету». Я посмотрел на динамические модели в Django, но ни одно из решений не кажется эффективным. Хост, который я использую, не поддерживает NoSQL, поэтому я не могу использовать это решение.

Как мне преобразовать это в действительный правильный дизайн Django ORM/SQL, чтобы запросы были эффективными, а код не повторялся?

Либо выберите Решение Entity-Attribute-Value для Django, либо используйте PostgreSQL и запрос к полю JSON Django.

Martijn Pieters 02.02.2019 18:51

Почему вы хотите создать новую модель для нового ключа? Разве не будет достаточно модели с объектом FK, видом (имя слота) и содержимым (что вы предпочитаете, текст или json)?

awesoon 02.02.2019 18:51

@awesoon Вот что я думал сделать. Однако есть небольшое предостережение: если содержимое слота — это сам JSON, и мне нужно искать внутри него ключи, то я снова сталкиваюсь с той же проблемой.

Parth Sharma 03.02.2019 11:41
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
333
0

Другие вопросы по теме