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

时间:2011-08-07 03:19:49

标签: django django-models

我有两个经理模型:类别和项目。

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()

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

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

我很乐意写...

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

    {% endfor %}
{% endfor %}

...没有为每个类别进行数据库调用。有人可以给我一些指示吗?我可以写一些原始的SQL来做这个,我有一些来自another Stack Overflow post的想法使这个工作,但我想在模型级别解决这个问题。

1 个答案:

答案 0 :(得分:1)

我认为你最好的选择可能就是查询所有已发布的item_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 %}

您不会显示您是否需要该类别的详细信息以及仅将其用作石斑鱼,但如果您这样做,则可以将select_related()添加到原始查询中。