绕过自定义模型管理器获取多个对象

2024-05-08 12:53:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我在一个维护项目,其中有一个模型说,与定制模型经理业务。这个定制模型管理器为在业务模型上执行的所有查询添加了一些额外的过滤器。这种商业模式有许多领域可以自称为培训师。到目前为止还不错,当我尝试获取与业务相关的所有培训师而不应用那些过滤器时,问题就出现了。你知道吗

商业模式如下:

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不是一个好的实践,但是这是我所得到的。你知道吗


Tags: name模型selftrue过滤器管理器models业务
1条回答
网友
1楼 · 发布于 2024-05-08 12:53:32

一般来说,最好在默认的Manageravoid filtering results

It's a good idea to be careful in your choice of default manager in order to avoid a situation where overriding get_queryset() results in an inability to retrieve objects you'd like to work with.

但是如果由于向后兼容的原因不能更改默认值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)

相关问题 更多 >

    热门问题