У меня есть следующая группа и модель контакта в колбе с Sql Alchemy ORM
group_contact = db.Table(
'group_contact',
db.Column('group_id', db.Integer, db.ForeignKey(
'group.id')),
db.Column('contact_id', db.Integer, db.ForeignKey(
'contact.id')),
db.PrimaryKeyConstraint('group_id', 'contact_id')
)
class Group(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(100))
class Contact(db.Model):
id = db.Column(db.Integer, primary_key=True)
phone = db.Column(db.String(15), nullable=False, unique=True)
groups = db.relationship(
"Group", secondary=group_contact, backref='contacts')
Теперь мне нужно запросить контакт с группами:
contacts = Contact.query.join(Group, Contact.groups).all()
for contact in contacts:
print(contact.groups)
Здесь проблема в том, что количество запросов SQL увеличивается с увеличением числа контактов, когда я выполняю приведенный выше код.
Django ORM имеет prefetch_related () с набором запросов, который выполняет следующие действия в соответствии с django docs .
prefetch_related, с другой стороны, выполняет отдельный поиск для каждого отношения и выполняет "соединение" в Python. Это позволяет ему предварительно выбирать объекты «многие ко многим» и «многие к одному», что невозможно сделать с помощью select_related, в дополнение к внешнему ключу и отношениям «один к одному», которые поддерживаются select_related.
Теперь я пытаюсь сделать то же самое с Sql Alchemy с помощью следующего кода:
contacts = Contact.query.all()
contact_groups = group_contact.query.join(
Group
).filter(group_contact.contact_id.in_([item.id for item in contacts]))
Но это дает мне эту ошибку:
AttributeError: 'Table' object has no attribute 'query'
Как я могу получить prefetch_related, как функцию от django с SqlAlchemy?