Как логично совместить документы 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
235 +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 Апр 2024 в 13:10
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир