[英]Django Managers - Retrieving objects with non-empty set of related objects
[英]Model Manager for non-empty records that includes objects from another manager
我有兩個與經理一起的模型:“類別”和“項目”。
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來做到這一點,而我在另一個Stack Overflow帖子中也提出了一些建議,以使這項工作可行,但我想在模型級別解決此問題。
我認為您最好的選擇可能是只查詢按category_id排序的所有published_projects,然后將它們重新組合到模板中。
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()
添加到原始查詢中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.