Django Model Mixin: Добавление логгеров в модели save() и delete() с помощью миксинов

Я хотел бы, чтобы все мои модели наследовались от одного класса "loggingMixin". Проблема в том, что вместо использования save(), определенной в LoggingMixin, используется стандартная save(). (ни один из операторов печати в loggingmixin не выполняется, и мой трассировщик всегда ссылается на object.save() из моих представлений, а не на ошибку, вызванную loggingmixin.

все остальные журналы работают как надо, я могу сохранять и удалять объекты. но ничего не записывается в журнал. заранее спасибо за помощь!

import logging
logger = logging.getLogger(__name__)

## this file defines a mixin to logg all saves, updates, deletes and errors

class LoggingMixin:
    
    def save(self, *args, **kwargs):
        try:
            print("---------------------------------------------------------------1")
            if hasattr(self.pk):
                print("---------------------------------------------------------------2")
                if self.pk is None:
                    # Object is new
                    print("---------------------------------------------------------------3")
                    super(LoggingMixin, self).save(*args, **kwargs)
                    logger.info(f"{self._meta.db_table} object saved: " + str(str(self).split('\n')[1]))
                else:
                    # Object is being updated
                    print("---------------------------------------------------------------4")
                    super(LoggingMixin, self).save(*args, **kwargs)
                    logger.info(f"{self._meta.db_table} object updated: " + str(str(self).split('\n')[1]))
            else:
                # Object is being updated
                print("---------------------------------------------------------------5")
                super(LoggingMixin, self).save(*args, **kwargs)
                logger.info(f"{self._meta.db_table} object updated: " + str(str(self).split('\n')[1]))
        # error when saving
        except Exception as e:
            print("-------------------------------------------------------------6")
            logger.error(f"Error saving {self._meta.db_table} object: " + str(str(self).split('\n')[1]) + f"Error: {e}")
            raise e

    def delete(self, *args, **kwargs):
        # delete log
        try:
            super(LoggingMixin, self).delete(*args, **kwargs)
            logger.info(f"{self._meta.db_table} object deleted. ID: {str(self.pk)}")
        # error when deleting
        except Exception as e:
            logger.error(f"Error deleting {self._meta.db_table} object: " + str(str(self).split('\n')[1]) + f"Error: {e}")
            raise e

Вот пример модели, наследующей от loggingmixin:

class ExistingCalculationsForUrl(Basemodel, LoggingMixin):
    url = models.CharField(max_length=512)
    content_type = models.ForeignKey(ContentType, on_delete=models.PROTECT, default=None)
    object_id = models.UUIDField(default=uuid.uuid4, editable=False)
    content_object = GenericForeignKey('content_type', 'object_id')
    week = models.ForeignKey('Weeks', on_delete=models.CASCADE, related_name='%(class)s_related_week')
    existing_calculation = models.JSONField()

    class Meta:
        managed = True
        db_table = 'existing_calculations_for_url'
        constraints = [models.UniqueConstraint(fields=['url', 'object_id', 'week'], name='unique_existing_calculation_for_url')]

порядок имеет значение -> switch Basemodel и LoggingMixin

class ExistingCalculationsForUrl(LoggingMixin, Basemodel):

посмотрите на https://whiztal.io/mixins-in-django-and-django-rest-framework/

Вернуться на верх