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/