Как использовать mongodb в Django с учетом гибкой структуры базы данных и запросов? - PullRequest
0 голосов
/ 22 мая 2019

Я разрабатываю приложение Django, которое использует mongodb в своей части. Моя схема базы данных меняется (некоторые поля удаляются / добавляются непрерывно), так как интегрировать ее с Django таким образом, чтобы принимать изменения без изменения старых данных и без влияния на поисковые запросы?

Я искал доступные библиотеки и нашел следующее:

  • mongoengine и django-mongodb-engine : mongoengine некоторое время не поддерживается и не обновляется, также для django-mongodb-engine требуется разветвленный старый пакет django-nonrel. Это соответствует вопросу: Используйте pymongo непосредственно в Django
  • djongo : Изначально он работает нормально с самыми обновленными версиями python и Django, и он принимает изменения в моих моделях баз данных без миграций, и админ-панель Django работает нормально. Позже, после внесения некоторых изменений, я столкнулся с проблемой, когда дело доходит до запроса базы данных или перечисления данных в административной панели. Старые данные не соответствуют новой модели, если изменение включает удаленные поля.
  • pymongo : Недостатком является то, что я не могу использовать модели или панели django, и мне приходится создавать собственный абстрактный слой базы данных, но преимущество заключается в более высоком контроле над базой данных. Это будет похоже на первое решение в Использование pymongo в Django напрямую , тогда я могу построить несколько слоев для различных структур баз данных, которые у меня будут

Использование djongo

Допустим, у меня есть модель с именем Test:

models.py

from djongo import models

class Test(models.Model):
    x = models.CharField(max_length=100)
    y = models.CharField(max_length=100)

Я создал новый объект, как показано ниже:

{
  _id: ObjectId("..."),
  x: "x1",
  y: "y1"
}

Затем я удалил поле y и добавил новое поле с именем z , затем я создал новый объект, поэтому он создается следующим образом:

{
  _id: ObjectId("..."),
  x: "x2",
  z: "z2"
}

Теперь я хочу извлечь все данные коллекции, как показано ниже:

python manage.py shell
>>Test.objects.all()
Error as field "y" is not exist in the model
>>Test.objects.filter(z="z2")
Error as field "y" is not exist in the model

Я могу понять, что его нельзя сопоставить с новой измененной моделью, но я хочу, чтобы старые поля игнорировались, по крайней мере, без ошибок, точно так же, как запросы в mongodb напрямую.

По моей просьбе, это неправильный подход к использованию джонго? Или есть обходной путь для решения этой проблемы? Если нет, как правильно применить это с помощью пимонго? Я ожидаю изменить поля моей коллекции с добавлением или удалением в любое время и извлекать все данные в любое время без ошибок.

...