绕过自定义模型管理器以获取 ManyToMany 对象
Bypassing custom Model Manager to get ManyToMany objects
我正在处理一个维护项目,该项目的模型为带有自定义模型管理器的业务。这个自定义模型管理器为在业务模型上执行的所有查询添加了一些额外的过滤器。此业务模型有一个 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
是 returns 所有与业务关联的培训师的功能,但是我希望结果绕过 CityManager
并使用默认管理器。
任何指点将不胜感激。
更新:
使用use_for_related_fields = False
无效。我在这里找到了一个相关的bug。有解决办法吗?我知道覆盖默认 objects
不是一个好习惯,但这是我收到的。
一般来说,默认Manager
中的avoid 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)
我正在处理一个维护项目,该项目的模型为带有自定义模型管理器的业务。这个自定义模型管理器为在业务模型上执行的所有查询添加了一些额外的过滤器。此业务模型有一个 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
是 returns 所有与业务关联的培训师的功能,但是我希望结果绕过 CityManager
并使用默认管理器。
任何指点将不胜感激。
更新:
使用use_for_related_fields = False
无效。我在这里找到了一个相关的bug。有解决办法吗?我知道覆盖默认 objects
不是一个好习惯,但这是我收到的。
一般来说,默认Manager
中的avoid 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)