我有几个模型与ForeignKeys的关系相互连接 此类层次结构中的主要字段包含所有者字段。
我想为所有这些模型创建一个单一自定义管理器,根据调用它的模型更改返回的查询集。
我知道经理可以访问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__
答案 0 :(得分:1)
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
而不获取模型的名称。