0

我有一个模型,我从中创建了一个代理模型,以便我可以覆盖默认“对象”管理器的 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')
4

1 回答 1

0

..self.answer...目的是让 AuditTrail 通过代理模型的实例更新模型 SubjectConsent 的审计跟踪。通过正常的模型类继承,管理器不会被继承。我不确定这是否也适用于“代理模型”设计,但在我的情况下,代理模型中不存在 AuditTrail 管理器。

将“history = AuditTrail()”添加到代理模型会导致错误,因为 AuditTrail 使用模型的相同属性将自身添加到代理模型。

所以,我现在能想到的就是获取模型的一个实例并在 super(SubjectConsentY1, self).save() 之后调用它的 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
于 2011-11-17T05:53:22.200 回答