Я пытался использовать FieldTracker в моем проекте для отслеживания полей, которые были обновлены из сигнала post_save
.Изначально я думал об использовании django-dirtyfields , но поскольку он не поддерживал django 2.1 , мне пришлось прибегнуть к django-model-utils .
Ниже приведена настройка проекта
customer / apps.py
from django.apps import AppConfig
class CustomerConfig(AppConfig):
name = 'customer'
def ready(self):
import customer.signals
customer / models.py
from model_utils import FieldTracker
class CreatedByModel(models.Model):
created_by = models.ForeignKey(User, blank=True, null=True)
modified_by = models.ForeignKey(User, blank=True, null=True)
class Meta:
abstract = True
class Customer(CreatedByModel)
name = models.CharField(max_length=255)
code = models.CharField(max_length=10)
customer_tracker = FieldTracker()
Включая здесь код администратора save_model
, поскольку я явно устанавливаю здесь поля created_by
и modified_by
и вызываю суперкласс save_model
, который, я не уверен, может вызвать проблему
customer / admin.py
class CustomerAdmin(admin.ModelAdmin):
def save_model(self, request, obj, form, change):
if not obj.created_by:
obj.created_by = request.user
else:
obj.modified_by = request.user
super().save_model(request, obj, form, change)
customer / signal.py
from django.db.models.signals import post_save
from django.dispatch import receiver
from .models import Customer
@receiver(post_save, sender=Customer)
def notify_api_clients(sender, **kwargs):
print('hit inside tracker {}' . format(sender.customer_tracker.changed()))
Я получаю AttributeError
ошибка при попытке сохранить объект Customer с указанием 'FieldTracker' object has no attribute 'changed'
.
Я не уверен, в чем может быть проблема здесь.Примите во внимание любые рекомендации.
ОБНОВЛЕНИЕ После нескольких испытаний я смог получить поля измененных () после вызова его, используя экземпляр в post_save
аргументах **kwargs
следующим образом
@receiver(post_save, sender=Customer)
def notify_api_clients(sender, **kwargs):
if 'instance' in kwargs:
instance = kwargs['instance']
print('changed fields: {}' . format(instance.customer_tracker.changed()))
Надеюсь, это могло быть то, чего мне не хватало.