我有几个模型通过外键关系相互连接。
这种层次结构中的主要层次结构包含一个 店主 field 。
我想创建一个 单个自定义管理器 为 所有这些型号根据调用它的模型更改返回的查询集。
我知道经理可以访问self.model
获取它所连接的模型。
Class Main(models.Model)
owner=models.ForeignKey (User)
owned = OwnedManager()
Class Second(models.Model)
main=models.ForeignKey('Main')
owned = OwnedManager()
Class Third(models.Model)
second=models.ForeignKey('Second')
owned = OwnedManager()
我希望我的自定义管理器具有这种行为:
class OwnedManager(models.Manager):
def get_owned_objs(self, owner):
if self.model == 'Main': # WRONG: How do I get the model name?
owned_main = self.filter(owner=owner)
return owned_main
elif self.model == 'Second':
owned_second = self.filter(main__owner=owner)
return owned_second
else:
owned_third = self.filter(second__main__owner=owner)
return owned_third
为了以一致的方式在不同的模型中调用它,如下所示:
main_object.owned.get_owned_objs(owner=user1) # of the Model Main
second_object.owned.get_owned_objs(owner=user1) # of the Model Second
third_object.owned.get_owned_objs(owner=user1) # of the Model Third
问题:
self.model == 'Main'
是错的。我没有得到这样的模型名称。有没有办法得到它? 编辑 - 我的解决方案:
下面接受的答案是一个很好的解决方案,但我也找到了一种方法来获取调用自定义管理器的特定模型的模型名称,即:
if self.model.__name__ == 'Main':
这里的关键是属性
__name__
最佳答案
1)制作抽象模型
class AbstractModel(models.Model):
class Meta(models.Meta):
abstract = True
objects = OwnedManager()
2)从AbstractModel继承你的模型,在meta中放一些键
class Model(AbstractModel)
class Meta(AbstractModel.Meta):
filter_key = 'some_key'
3)重新设计你的OwnedManager
class OwnedManager(models.Manager):
def get_owned_objs(self, owner):
if hasattr(self.model._meta, 'filter_key'):
return self.filter(**{self.model._meta.filter_key: owner})
现在您可以使用
SomeModel.objects.get_owned_objs(owner=user1)
在任何继承模型中,其中 filter_key
设置时没有获取模型的名称。
关于django - Django 中多个模型的单个自定义管理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17968501/