Django中多个模型的单一自定义管理器
我有几个模型通过外键关系相互连接。Django中多个模型的单一自定义管理器,django,django-models,django-managers,django-custom-manager,Django,Django Models,Django Managers,Django Custom Manager,我有几个模型通过外键关系相互连接。 这种层次结构中的主层次结构包含一个所有者字段 我想为所有这些模型创建一个单一自定义管理器,根据调用它的模型更改返回的查询集 我知道经理可以访问self.model以获取它所连接的模型 Class Main(models.Model) owner=models.ForeignKey (User) owned = OwnedManager() Class Second(models.Model) main=models.ForeignKey('Mai
这种层次结构中的主层次结构包含一个所有者字段 我想为所有这些模型创建一个单一自定义管理器,根据调用它的模型更改返回的查询集 我知道经理可以访问
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':
这里的关键是属性\uuu name\uuu
1)Make抽象模型
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) 重新设计你自己的管理者
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\u key
,而不获取模型的名称。谢谢,这看起来是一个很好的解决方案,我要试试。我还找到了一种从自定义管理器获取模型名称的方法。我已经更新了我的问题,包括我的解决方案。