簡體   English   中英

模型管理器,用於非空記錄,包括來自另一個管理器的對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM