[英]Django Model Mixin: Adding loggers to model save() and delete() using Mixins
我希望我所有的模型都繼承自一個“loggingMixin”class。問題是,不是使用 LoggingMixin 中定義的 save(),而是使用標准的 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
下面是一個 model 繼承自 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')]
訂單事項 -> 切換 Basemodel 和 LoggingMixin
class ExistingCalculationsForUrl(LoggingMixin, Basemodel):
看看https://whiztal.io/mixins-in-django-and-django-rest-framework/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.