FieldTracker генерирует AttributeError в сигнале post_save, связывая поля измененных () - PullRequest
0 голосов
/ 13 ноября 2018

Я пытался использовать 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()))

Надеюсь, это могло быть то, чего мне не хватало.

...