Доброго времени суток. Есть такая задача. Есть модели 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. Помогите, пожалуйста =)