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