绕过自定义模型管理器以获取ManyToMany对象

时间:2015-03-01 14:30:04

标签: python django django-models

我正在开发一个维护项目,该项目的模型与自定义模型管理器相关。此自定义模型管理器为在Business模型上执行的所有查询添加了一些额外的过滤器。此商业模型具有自我命名的培训师的ManyToMany字段。到目前为止,当我尝试在不应用这些过滤器的情况下获取与业务相关的所有培训师时,问题就出现了。

商业模式如下:

class Business(Basetable):
    #status P=publish    H=inactive    D=draft    N=new
    name = models.CharField(max_length=120)
    slug = models.SlugField(max_length=150)
    logo=models.OneToOneField("BusinessLogo",null=True,on_delete=models.SET_NULL)
    categories = models.ManyToManyField("BusinessCategory",related_name='allcategories',null=True)
    price_type = models.CharField(max_length=2,
                                      choices=PRICE_CHOICES,
                                      default=YEARLY, null=True, blank=True)
    achievements = models.TextField(null=True, blank=True)
    years_of_experience = models.FloatField(null=True, blank=True)

    trainers = models.ManyToManyField("self",related_name='btrainers',null=True, blank=True, symmetrical=False)
    expense=models.IntegerField(null=True,blank=True)
    objects= CityManager()

    def get_trainers(self):
      return self.trainers.all()

get_trainers是返回与业务关联的所有培训师的函数,但是我希望结果绕过CityManager并使用默认的管理器。

任何指针都将受到赞赏。

更新

使用use_for_related_fields = False不起作用。我在这里找到了一个相关的bug。有工作吗?我知道覆盖默认objects不是一个好习惯,但这是我收到的。

1 个答案:

答案 0 :(得分:3)

一般情况下,默认Manager中的avoid filtering results最好:

  

在选择默认管理器时要小心谨慎,以避免覆盖get_queryset()导致无法检索您想要使用的对象。

但是,如果由于向后兼容性原因无法更改默认Manager,您仍然可以明确创建普通Manager并使用该结果获取结果。

class Business(Basetable):
    ...
    objects = CityManager()  # Still the first listed, and default
    plain_objects = models.Manager()

现在你有一个普通的Manager,用它来显式访问所需的对象:

def get_trainers(self):
    return Business.plain_objects.filter(btrainers__id=self.id)