Mongoengine Ссылка на существующую коллекцию

Я работаю с Flask/Mongoengine-MongoDB для своего последнего веб-приложения.

Я знаком с Pymongo, но я новичок в средствах сопоставления объектов и документов, таких как Mongoengine.

У меня уже есть база данных и коллекция, и я просто хочу запросить ее и вернуть соответствующий объект. Вот посмотрите на мои models.py...

from app import db

# ----------------------------------------
# Taking steps towards a working backend.
# ----------------------------------------

class Property(db.Document):

    # Document variables.
    total_annual_rates = db.IntField()
    land_value = db.IntField()
    land_area = db.IntField()
    assessment_number = db.StringField(max_length=255, required=True)
    address =  db.StringField(max_length=255, required=True)
    current_capital_value = db.IntField
    valuation_as_at_date = db.StringField(max_length=255, required=True)
    legal_description = db.StringField(max_length=255, required=True)
    capital_value = db.IntField()
    annual_value = db.StringField(max_length=255, required=True)
    certificate_of_title_number = db.StringField(max_length=255, required=True)

    def __repr__(self):
        return address

    def get_property_from_db(self, query_string):
        if not query_string:
            raise ValueError()
        # Ultra-simple search for the moment.
        properties_found = Property.objects(address=query_string)
        return properties_found[0]

Я получаю следующую ошибку: IndexError: no such item for Cursor instance

В этом есть смысл, поскольку объект не указывает ни на какую коллекцию. Несмотря на то, что я некоторое время просматривал документы, я до сих пор понятия не имею, как это сделать.

Кто-нибудь из вас знает, как правильно связать мой класс Property с моей уже существующей базой данных и коллекцией?


person David K.    schedule 23.08.2014    source источник


Ответы (2)


Способ связать класс с существующей коллекцией может быть выполнен как таковой, используя meta:

class Person(db.DynamicDocument):

    # Meta variables.
    meta = {
        'collection': 'properties'
    }

    # Document variables.
    name = db.StringField()
    age = db.IntField()

Затем при использовании объекта класса можно использовать эту функциональность, как и следовало ожидать от MongoEngine:

desired_documents = Person.objects(name="John Smith")
john = desired_documents[0]

Или что-то подобное :) Надеюсь, это поможет!

person David K.    schedule 26.08.2014

Я гуглил этот же вопрос и заметил, что ответ изменился по сравнению с предыдущим ответом:

Согласно последнему руководству Mongoengine:

Если вам нужно изменить имя коллекции (например, чтобы использовать MongoEngine с существующей базой данных), создайте атрибут словаря класса с именем meta в своем документе и установите для коллекции имя коллекции, которое вы хотите, чтобы ваш класс документа использовал. :

class Page(Document):
meta = {'collection': 'cmsPage'}

Код на сером сделал свое дело, и я мог мгновенно использовать свои данные.

person Ilmari Kumpula    schedule 19.07.2018