django-mptt: отфильтровать все категории, имеющие онлайн-запись - PullRequest
0 голосов
/ 09 марта 2012

Я передаю эту систему блогов Django систему категорий в 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 голосов
/ 09 марта 2012

Это выглядит хорошим решением для первого пути:

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)
...