2016-01-26 3 views
4

Я пришел из мира .NET, где ORM NHibernate может заполнять отношения внешних ключей, загружая объект по id. Загрузка объекта просто возвращает прокси этого объекта с указанным вами идентификатором. Это полезно для заполненных отношений, когда я знаю, что существует идентификатор, поскольку ему не нужно запрашивать базу данных, тем самым экономя много круговых поездок.Может SQLAlchemy заполнять отношения внешних ключей без запроса базы данных?

Вот мой сценарий. У меня есть модель клиента, которая может быть связана с одним или несколькими подразделениями. Эти разделы статически хранятся в базе данных и могут быть связаны с одним или несколькими клиентами, что требует от меня моделирования отношения «многие ко многим». Существует маршрут REST API в виде /api/v1/customers/123/divisions, где I POST JSON данные в виде списка идентификаторов деления, {'division_ids': [1, 2, 3, 4]}. В этом случае (использование в реальном мире могло бы равняться 20+ идентификаторам подразделения, я должен был бы выдать запрос для извлечения клиента (id 123), а также 4 запроса для извлечения разделов.

Поскольку я знаю, корочки подразделений, которые я хочу вставить, я могу заставить SQLAlchemy просто использовать идентификатор, а не извлечение объектов?

может SQLAlchemy сделать что-то подобное?

ответ

0

Если я правильно понимаю ваш вопрос, да, вы можете сделать поэтому с использованием lazy="dynamic" в связи. Docs:

Ключевой особенностью, позволяющей управлять большой коллекцией, является так называемое «динамическое» отношение. Это необязательная форма отношения(), которая возвращает объект Query вместо коллекции при доступе. фильтр() критерий может быть применен, а также пределы и смещений, явно или с помощью массива ломтиков:

Пример таблица:

class Parent(Base): 
    __tablename__ = 'parent' 
    id = Column(Integer, primary_key=True) 
    children = relationship("Child", lazy="dynamic") 

class Child(Base): 
    __tablename__ = 'child' 
    id = Column(Integer, primary_key=True) 
    parent_id = Column(Integer, ForeignKey('parent.id')) 

Когда объект Родителя загружен, дети не будут загружены ; вместо этого на его место будет загружен объект Query, который может быть использован для доступа к детям, если это необходимо.

p = session.query(Parent).first() # children will not be loaded here 
print(type(p.children)) # <class 'sqlalchemy.orm.dynamic.AppenderQuery'> 
all_children = p.children.all() # conduct a query on the children query object 
print(all_children) # [<__main__.Child object at 0x10ba3f908>, <__main__.Child object at 0x10ba3f978>] 
+0

Извините, мой вопрос был не очень ясен. Я обновил его с помощью моего точного сценария. – onetwothree

Смежные вопросы