我有两个经理模型:类别和项目。
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的想法使这个工作,但我想在模型级别解决这个问题。
答案 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()
添加到原始查询中。