模型管理器用于包含来自另一个管理器的对象的非空记录



我有两种管理模式:类别和项目。

class PopulatedCategoriesManager(models.Manager):
    def get_query_set(self):
        return super(PopulatedCategoriesManager, self) 
            .get_query_set() 
            .filter(projects__is_published=True).distinct()
class Category(models.Model):
    title = models.CharField(max_length=50)
    class Meta(Orderable.Meta):
        verbose_name_plural = 'Categories'
    objects = models.Manager()
    populated = PopulatedCategoriesManager()
class PublishedProjectsManager(models.Manager):
    def get_query_set(self):
        return super(PublishedProjectsManager, self) 
            .get_query_set().filter(is_published=True)
class Project(models.Model):
    title = models.CharField(max_length=50)
    category = models.ForeignKey(Category, related_name='projects')
    #other fields
    objects = models.Manager()
    published = PublishedProjectsManager()

populatedcategoresmanager按预期工作,仅返回具有已发布项目的类别,但我的问题是在模板级别。我无法访问已发布的项目。

在循环中,类别实例不知道如何只访问已发布的项目,所以我很好奇获得这些对象的最有效方法是什么?

我很想写…

{% for category in categories %}
    {% for project in category.published_projects.all %}
    {% endfor %}
{% endfor %}

…无需对每个类别进行数据库调用。有人能给我点建议吗?我可以写一些原始的SQL来做到这一点,我有一些想法从另一个堆栈溢出的帖子,使这项工作,但我想在模型层面解决这个问题。

我认为你最好的选择可能只是查询所有publishhed_projects,按category_id排序,然后在模板中重新分组。

projects = Project.published.all().order_by('category_id')

{% regroup projects by category_id as project_categories %}
{% for category in project_categories %}
    {% for project in category.list %}
        {{ project.title }}
    {% endfor %}
{% endfor %}

您没有显示您是否需要类别的详细信息以及仅将其用作grouper,但是如果您需要,您可以将select_related()添加到原始查询中。

最新更新