我有两种管理模式:类别和项目。
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()
添加到原始查询中。