Модель прокси Django и AuditTrail - PullRequest
0 голосов
/ 16 ноября 2011

У меня есть модель, из которой я создал прокси-модель, чтобы я мог переопределить метод get_query_set менеджера объектов по умолчанию.Модель реализует AuditTrail , но прокси-сервер игнорирует это - что я не хочу.Я хочу, чтобы save () через модель прокси обновляла контрольный журнал точно так же, как модель.

class SubjectConsent(BaseSubjectConsent):

    history = AuditTrail() 


class SubjectConsentY1(SubjectConsent):

    objects = SubjectY1Manager()

    class Meta:
        proxy = True

Ожидается ли такое поведение?То есть менеджеры модели недоступны для прокси?

Мой пользовательский менеджер выглядит так:

class SubjectY1Manager(models.Manager):

   def get_query_set(self):

        return QuerySet(self.model, using=self._db).filter(survey__survey_slug = 'mpp-year-0')

1 Ответ

0 голосов
/ 17 ноября 2011

.. self.answer ... Целью является получение AuditTrail для обновления контрольного журнала для модели SubjectConsent через экземпляр прокси-модели. Через обычное наследование классов модели менеджеры не наследуются. Я не уверен, относится ли это также к дизайну "модели прокси", но в моем случае менеджер AuditTrail отсутствует в модели прокси.

Добавление «history = AuditTrail ()» в модель прокси вызывает ошибку, поскольку AuditTrail добавляет себя в модель прокси, используя те же атрибуты модели.

Итак, все, что я мог бы сейчас придумать, это получить экземпляр модели и вызвать ее метод save () после super (SubjectConsentY1, self) .save (). Это дополнительный вызов БД, но, таким образом, журнал аудита обновляется через экземпляр прокси-модели.

class SubjectConsent(BaseSubjectConsent):

    history = AuditTrail() 


class SubjectConsentY1(SubjectConsent):

    objects = SubjectY1Manager()

    def save(self, *args, **kwargs):
        # call super save() method to update the DB and get a pk
        super(SubjectConsentY1, self).save(*args, **kwargs)
        # get instance of model and save to update the audit trail
        SubjectConsent.objects.get(pk=self.pk).save()

    class Meta:
        proxy = True
...