我想覆盖一个班级的相关经理。
我有一个Company
模型。它有state
列,可以在ACTIVE
,INACTIVE
,SUSPENDED
。我添加了两个名为SALES
,CLOSED
的新状态。
由于它的遗留模型,只是添加状态可能是毁灭性的(代码中有很多地方不会按状态过滤)。
所以,为了避免其他地方无意中发生变化,我决定隐藏所有其他应用程序/其他地方的新状态,除非另有要求(我只为我们的应用程序/型号列入白名单)
我已经覆盖了公司的对象管理员。
class CompanyManager(models.Manager):
def get_queryset(self):
return super(CompanyRelatedManager, self).get_queryset().exclude(state__in=['SALES', 'CLOSED'])
class Company(models.Model):
_default_manager = models.Manager()
objects = CompanyManager()
allObjects = models.Manager()
name = models.TextField()
...
salesContact = models.ForeignKey(Contact)
问题在于Company.objects.filter(blah=blah)
过滤掉了新状态。但salesContact.companies.all()
之类的东西并不适用。
In [9]: salesContact.companies
Out[9]: <django.db.models.fields.related.RelatedManager at 0x12157a990>
我的问题是如何覆盖salesContact = models.ForeignKey(Contact)
和喜欢的相关管理器,以便我可以修改默认查询集以排除我的新状态。
而且,我无法覆盖默认管理器,因为覆盖默认管理器也意味着我覆盖db_manager
会导致意外后果(db尝试插入而不是更新,其他整个故事)。