def products_changed_handler(sender, **kwargs):
"""
?????????? ??????? ????????? ???-?? ??????? ?????????,
??????????? ??????????????? ? ?????????.
???????????? ??? ?????????? ????????? ??????? ? ?????? ?????????.
"""
categories = kwargs.get('categories')
if isinstance(categories, ShopCategory):
# ????????? ?????????
categories = ShopCategory.objects.filter(pk=categories.pk)
elif isinstance(categories, (int, str)):
# ?????? ??? ?????, ?????????? ID ?????????
categories = ShopCategory.objects.filter(pk=categories)
elif isinstance(categories, (list, tuple, set, ValuesListQuerySet)):
# ?????? ????? ??? ?????, ?????????? ID ?????????
categories = ShopCategory.objects.filter(pk__in=categories)
elif isinstance(categories, QuerySet) and categories.model is ShopCategory:
# QuerySet ?????????
pass
else:
raise TypeError('Invalid categories for signal "products_changed"')
with transaction.atomic():
categories.update(
product_count=RawSQL(
'(SELECT COUNT(*) '
'FROM shop_shopproduct AS ssp '
'WHERE ssp.category_id = shop_shopcategory.id '
'AND ssp.is_visible = TRUE)',
()
)
)
categories.update(
total_product_count=F('product_count')
)
categories_changed.send(ShopCategory, categories=categories)
评论列表
文章目录