Как логично совместить документы mongodb с объектами проекта? У меня в проекте есть некоторые сущности, объекты, например класс User, класс Chat и есть документы к которым они привязаны. Могу ли я, каким-либо образом, расширить объект документа? То есть сейчас чтобы обходится только классом Chat мне приходится использовать такую лапшу, а ведь мне всего навсего нужно только создавать чат в базе данных, если его нет и добавить один проперти-метод.class Chat(Document):
bot = ObjectIdField(required=True)
i = LongField(required=True)
greeting = BooleanField(default=True, required=True)
rules = StringField(min_length=2)
silence_ts = LongField(required=True)
games = EmbeddedDocumentListField(Game)
meta = {
'indexes': [
{"fields": ["bot", "i"], "unique": True}
]
}class Chat:
def __init__(self, bot, i=0):
self.bot = bot
self.i = i
def __getattr__(self, item):
data = modules.Chat.objects(bot=self.bot.id, i=self.i)
if not data:
data = modules.Chat(bot=self.bot.id, i=self.i).save()
else:
data = data[0]
return getattr(data, item)
@property
def is_silence(self):
return self.silence_ts >= tools.ts()
И за это я плачу невозможностью обновлять многие значения "на лету". Приходится вместоuser = modules.User.objects.first()
# ...
user.balance += 1000
Делатьuser = User(bot, 1)
# ...
user.update(inc__balance=1000)
Только кажется красиво, но с большими структурами документа, при таком раскладе, можно просто помереть.

21 Авг 2019 в 06:59
214 +1
0
Ответы
1

Для более удобной работы с данными в MongoDB и их связывания с объектами проекта, вы можете воспользоваться библиотекой MongoEngine. MongoEngine предоставляет возможность создания классов моделей для документов MongoDB, которые могут быть использованы для взаимодействия с базой данных.

Пример использования MongoEngine для вашего примера:

from mongoengine import *
import modules
connect('mydb')
class User(Document):
balance = IntField(default=0)
class Chat(Document):
bot = ReferenceField(User, required=True)
i = IntField(required=True)
greeting = BooleanField(default=True, required=True)
rules = StringField(min_length=2)
silence_ts = IntField(required=True)
games = EmbeddedDocumentListField(Game)
# Добавление методов или свойств класса Chat
# Создание нового чата
def create_chat(bot, i):
chat = Chat(bot=bot, i=i)
chat.save()
return chat
# Обновление баланса пользователя
def update_balance(user_id, amount):
user = modules.User.objects(id=user_id).first()
user.balance += amount
user.save()
# Получение чата по боту и номеру
def get_chat(bot_id, i):
chat = Chat.objects(bot=bot_id, i=i).first()
if not chat:
chat = create_chat(bot_id, i)
return chat
# Пример использования
user = User(balance=1000)
user.save()
bot = user
chat = get_chat(bot.id, 1)
chat.greeting = False
chat.save()
update_balance(user.id, -500)

Таким образом, с использованием MongoEngine вы сможете более удобно обращаться к данным в MongoDB, создавать связи между объектами и документами, а также обновлять данные "на лету".

20 Апр в 13:10
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 648 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир