Django 可重用查询集

Posted

技术标签:

【中文标题】Django 可重用查询集【英文标题】:Django Resuable QuerySet 【发布时间】:2012-12-12 02:01:25 【问题描述】:

我在如下视图中有一个 QuerySet。我希望能够在其他视图中使用相同的查询,但我不想复制和粘贴代码。这也感觉我会违反 DRY 原则。

如果我想在以后修改查询,我将不得不在我的所有视图中更改它,这显然不理想。在我的模型中是否有我应该创建的类或方法可以让我从许多不同的视图中调用它?有没有这方面的最佳实践?

tasks = Task.objects.filter(user = request.user).order_by('-created_at', 'is_complete')

【问题讨论】:

这能回答你的问题吗? Where to put common queries in Django? 【参考方案1】:

其中一种解决方案是在模型上创建一个类方法或扩展模型的管理器。

from django.db import models

    添加类方法

    class MyModel(models.Model):
        @classmethod
        def get_user_tasks(cls, user):
            return cls.objects.filter(...).order_by(...)
    

    覆盖经理

    class MyModelManager(models.Manager):
        def get_user_tasks(self, user):
            return self.filter(...).order_by(...)
    
    class MyModel(models.Model):
        objects = MyModelManager()
    
    # and in the view...
    queryset = MyModel.objects.get_user_tasks(request.user)
    

【讨论】:

其中,Manager 方法更符合 Django-nic。

以上是关于Django 可重用查询集的主要内容,如果未能解决你的问题,请参考以下文章

为可重用的 Django 应用程序创建迁移

如何为 django 可重用应用程序启动测试?

创建可重用的 Django 应用程序?

在实际生产项目中部署(管理依赖)django 可重用应用程序的最佳实践是啥?

django 可重用应用程序:删除迁移中的依赖项?

如何在 Django 命名空间可重用应用程序中进行反向 URL 搜索