2011-11-16 61 views
0

我有一个模型,我创建了一个代理模型,以便我可以重写默认'对象'管理器的get_query_set方法。该模型实现了AuditTrail,但代理忽略它 - 这不是我想要的。我想通过代理模型来保存()以更新审计线索,就像模型一样。Django代理模型和AuditTrail

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

更好地展现更多的代码,因为这应该是正确的做法是:https://docs.djangoproject.com/en/dev/topics/db/models/#proxy-model-managers。也许经理的实现出了问题......编辑:对不起,再次阅读你的问题:'save()'实际上不是一个管理器方法!您可以尝试覆盖代理模型的默认保存方法,并明确尝试在父类中调用它... –

+0

保存代理模型的实例时会调用模型的save()方法。我怀疑这必须在AuditTrail的实施方式上做得更多 – erikvw

+0

你有'SubjectConsent'上的'objects'管理器还是'history'?默认为 –

回答

0

..self.answer ......我们的目的是让跟踪线索来更新模型,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