@froosty

Как в событии before_update в SQL Alchemy обработать только непосредственное изменение полей, а полей-связей?

Доброго времени суток. Есть такая задача. Есть модели Category и Product. Между ними связь "many-to-many". Нужно на событие before_update для категории навесить обработчик с опр. дополнительными действиями. Собственно, в урезанном виде это выглядит вот так:
category_product = db.Table(
    'catalog_category_product',
    db.Column('id', db.Integer(), db.Sequence('catalog_category_product_id_seq'), primary_key=True, nullable=False),
    db.Column('category_id', db.Integer(), db.ForeignKey('catalog_category.id', ondelete='CASCADE'), nullable=False),
    db.Column('product_id', db.Integer, db.ForeignKey('catalog_product.id', ondelete='CASCADE'), nullable=False),
)


class Product(db.Model):
    __tablename__ = 'catalog_product'
    id = db.Column('id', db.Integer(), db.Sequence('catalog_product_id_seq'), primary_key=True, nullable=False)
    category_products = db.relationship('Category', secondary=category_product,
                                        backref=db.backref('category_products', lazy='dynamic'))
    # ...


class Category(db.Model, BaseNestedSets):
    __tablename__ = 'catalog_category'
    id = db.Column('id', db.Integer(), db.Sequence('catalog_category_id_seq'), primary_key=True, nullable=False)
    # ...


def before_update_category(mapper, connection, target):
    # Какие-то действия

event.listen(Category, 'before_update', before_update_category)

Проблема в следующем. Если я выполняю вот такой код:

"""
product - instance of Product
category - instance of Category
"""
product.category_products.append(category)


то всё равно срабатывает функция before_update_category. Опытным путём было выявлено, что происходит это из-за того, что orm считает поле category.product_category изменённым. Я понимаю, что мне нужно перед выполнением дополнительных действий проверить, изменилось ли какое-то из основных полей, или только поля со связями. СОбственно должно получиться что-то вроде:
def is_instance_really_updated(category):
    # Какой-то код
    #return bool result

def before_update_category(mapper, connection, target):
    if is_instance_really_updated(target):
        # Какие-то действия

Но не могу понять, что в таком случае должно быть в методе is_instance_really_updated. Помогите, пожалуйста =)
  • Вопрос задан
  • 249 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы