django - Django 中多个模型的单个自定义管理器

标签 django django-models django-managers django-custom-manager

我有几个模型通过外键关系相互连接。
这种层次结构中的主要层次结构包含一个 店主 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/

    相关文章:

    django - 自定义模型管理器方法和 QuerySet 方法有什么区别?

    Django:objects.raw() 无法获取结果,尽管 SQL 直接在 MySQL 中工作

    django - 用户管理器方法 create() 和 create_user()

    python - 下载文件并在响应中重定向

    python - Django HStore : How to override a key-value model field's __getattr__ and __setattr__

    python - 为什么 Django 的 URLField 默认截断为 200 个字符?

    python - Django 模型唯一约束异常

    python - Django 静态文件在 DEBUG=True 和 `collectstatic` 之后不一致

    python - Django 生成测试数据非常慢

    django - 如何将当前登录的用户指定为模型字段的默认值?