我有一个模型,我从中创建了一个代理模型,以便我可以覆盖默认“对象”管理器的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')
答案 0 :(得分:0)
.. self.answer ...目的是让AuditTrail通过代理模型的实例更新模型SubjectConsent的审计跟踪。通过普通的模型类继承,管理器不会被继承。我不确定这是否也适用于“代理模型”设计,但在我的情况下,AuditTrail管理器不存在于代理模型中。
将“history = AuditTrail()”添加到代理模型会导致错误,因为AuditTrail使用模型的相同属性将自身添加到代理模型。
所以,我现在想出的就是得到一个模型实例并在super(SubjectConsentY1,self).save()之后调用它的save()方法。这是对DB的额外调用,但是,通过这种方式,审计跟踪通过代理模型的实例进行更新。
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