Как логично совместить документы 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) Только кажется красиво, но с большими структурами документа, при таком раскладе, можно просто помереть.
Для более удобной работы с данными в 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, создавать связи между объектами и документами, а также обновлять данные "на лету".
Для более удобной работы с данными в 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, создавать связи между объектами и документами, а также обновлять данные "на лету".