Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django中多个模型的单一自定义管理器_Django_Django Models_Django Managers_Django Custom Manager - Fatal编程技术网

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
,而不获取模型的名称。

谢谢,这看起来是一个很好的解决方案,我要试试。我还找到了一种从自定义管理器获取模型名称的方法。我已经更新了我的问题,包括我的解决方案。