在django中定义自定义RelatedManager

时间:2017-01-10 07:05:13

标签: django django-models foreign-keys django-1.7 django-managers

我想覆盖一个班级的相关经理。

我有一个Company模型。它有state列,可以在ACTIVEINACTIVESUSPENDED。我添加了两个名为SALESCLOSED的新状态。

由于它的遗留模型,只是添加状态可能是毁灭性的(代码中有很多地方不会按状态过滤)。

所以,为了避免其他地方无意中发生变化,我决定隐藏所有其他应用程序/其他地方的新状态,除非另有要求(我只为我们的应用程序/型号列入白名单)

我已经覆盖了公司的对象管理员。

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尝试插入而不是更新,其他整个故事)。

0 个答案:

没有答案