在django中定义自定义RelatedManager

Moh*_*han 5 django foreign-keys django-models django-managers django-1.7

我想覆盖一个类的相关管理器。

我有一个Company模型。它有state可以在ACTIVE, INACTIVE,中的列SUSPENDED。我添加了 2 个新状态,称为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)
Run Code Online (Sandbox Code Playgroud)

问题在于Company.objects.filter(blah=blah)过滤掉了新的状态。但类似的事情salesContact.companies.all()却没有。

In [9]: salesContact.companies
Out[9]: <django.db.models.fields.related.RelatedManager at 0x12157a990>
Run Code Online (Sandbox Code Playgroud)

我的问题是如何覆盖相关管理器等,salesContact = models.ForeignKey(Contact)以便我可以修改默认查询集以排除我的新状态。

而且,我无法覆盖默认管理器,因为覆盖默认管理器也意味着我正在覆盖这会导致db_manager意外的后果(数据库尝试插入而不是更新,整个其他故事)。