django-mptt:过滤所有具有在线条目的类别

时间:2012-03-09 11:23:45

标签: django django-queryset django-mptt mptt

我将此Django Blog App类别系统传递给django-mptt。

我遇到的问题是关于_get_online_category方法。 此方法允许我仅获取具有Entry的类别。

def _get_online_categories(self):
    """
    Returns categories with entries "online" inside.
    Access this through the property ``online_entry_set``.
    """
    from models import Entry
    return Category.objects.filter(entries__status=Entry.STATUS_ONLINE).distinct()

如何修改它以便我也有类别有条目的类别?

例如:

我有Spain > Malaga而马拉加使用之前的方法获得了Entry,我只会Malaga而不是Spain我希望同时拥有这两种方法。

第二个问题:

如何从父类别中获取所有条目?

例如,从西班牙获得马拉加的帖子?

def _get_online_entries(self):
    """
    Returns entries in this category with status of "online".
    Access this through the property ``online_entry_set``.
    """
    from models import Entry        
    return self.entries.filter(status=Entry.STATUS_ONLINE)

online_entries = property(_get_online_entries)

这会返回西班牙的空结果。

1 个答案:

答案 0 :(得分:0)

This看起来是第一种方式的好解决方案:

def _get_online_categories(self):
    """
    Returns categories with entries "online" inside.
    Access this through the property ``online_entry_set``.
    """
    from models import Entry
    queryset =  self.categories.filter(entries__status=Entry.STATUS_ONLINE)

    new_queryset = queryset.none() | queryset
    for obj in queryset:
        new_queryset = new_queryset | obj.get_ancestors()
    return new_queryset

第二个问题

这样的事情会成功:

def _get_online_entries(self):
    """
    Returns entries in this category with status of "online".
    Access this through the property ``online_entry_set``.
    """
    from models import Entry        
    return Entry.objects.filter(status=Entry.STATUS_ONLINE, 
                                category__lft__gte=self.lft, 
                                category__rght__lte=self.rght)

online_entries = property(_get_online_entries)