Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在django中定义自定义RelatedManager_Django_Django Models_Foreign Keys_Django 1.7_Django Managers - Fatal编程技术网

在django中定义自定义RelatedManager

在django中定义自定义RelatedManager,django,django-models,foreign-keys,django-1.7,django-managers,Django,Django Models,Foreign Keys,Django 1.7,Django Managers,我想重写类的相关管理器 我有一个公司型号。它有状态列,可以位于活动、非活动、暂停。我正在添加两个新的状态,称为销售,关闭 由于它的遗留模型,仅仅添加状态可能是毁灭性的(代码中有很多地方不按状态过滤) 因此,为了避免其他地方的无意更改,我决定为所有其他应用/其他地方隐藏我们的新状态,除非另有要求(我将仅为我们的应用/型号列出白名单) 我已经覆盖了公司中的对象管理器 class CompanyManager(models.Manager): def get_queryset(self):

我想重写类的相关管理器

我有一个
公司
型号。它有
状态
列,可以位于
活动
非活动
暂停
。我正在添加两个新的状态,称为
销售
关闭

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

因此,为了避免其他地方的无意更改,我决定为所有其他应用/其他地方隐藏我们的新状态,除非另有要求(我将仅为我们的应用/型号列出白名单)

我已经覆盖了公司中的对象管理器

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.companys.all()
这样的东西却没有

In [9]: salesContact.companies
Out[9]: <django.db.models.fields.related.RelatedManager at 0x12157a990>
[9]中的
:salesContact.companys
出[9]:
我的问题是如何覆盖
salesContact=models.ForeignKey(Contact)
等的相关管理器,以便修改默认查询集以排除我的新状态


而且,我不能覆盖默认管理器,因为覆盖默认管理器也意味着我覆盖了
db_管理器
,这导致了非预期的结果(db尝试插入而不是更新,整个其他故事).

没有回答我的问题,因为那里的答案提出了解决该问题的另一种方法。我正在努力解决这个问题。不幸的是,我是@django 1.7,所以在虚拟环境中尝试您的解决方案。很抱歉,我错过了关于django 1.7的部分。但我认为您应该升级,因为1.7不再受支持。迁移功能本身就可以让升级完全值得。django的问题是,公司不断地在fork上添加,而实际上没有添加到django。是的,我们正在努力解开叉子并升级。是的,这有点问题。这就是为什么其他公司会构建可插拔的应用程序或现有django类的子类。