ruchej
@ruchej
Конструктор мебели. Пишу макросы для К3-Мебель

Как отобрать посты по статусу?

Доброго дня!
Пробую писать избитое приложение блога.
В модели две таблицы: рубрика и посты.
У обеих таблиц есть статус: черновик и опубликовано.
Не хватает знаний, что бы сделать отбор по статусу опубликовано из обеих таблиц.
Сейчас сделан отбор только по статусу "опубликовано" из таблицы посты.

#models.py

from django.db import models
from django.utils import timezone
from django.conf import settings
from django.urls import reverse

class PublishedManager(models.Manager):
    def get_queryset(self):
        return super(PublishedManager, self).get_queryset()\
                                            .filter(status='published')

class CommonInfo(models.Model):
    'Абстрактная модель для общих полей'
    STATUS_CHOICES = (
        ('draft', 'Черновик'),
        ('published', 'Опубликовано'),
        )
    title = models.CharField(max_length=200, verbose_name='Заголовок')
    description = models.CharField(max_length=160, blank=True, null=True, verbose_name='Краткое описание')
    status = models.CharField(max_length=10, choices=STATUS_CHOICES, default='draft', verbose_name='Статус')
    objects = models.Manager()
    published = PublishedManager()

    class Meta:
        abstract = True

class Rubric(CommonInfo):

    class Meta:
        verbose_name = 'Рубрика'
        verbose_name_plural = 'Рубрики'

    def __str__(self):
        return self.title

class Post(CommonInfo):
    cover = models.ImageField(upload_to='cover', height_field=600, width_field=600, max_length=200, blank=True, null=True, verbose_name='Обложка')
    rubric = models.ForeignKey(Rubric, on_delete=models.CASCADE, verbose_name='Рубрика')
    slug = models.CharField(max_length=200, unique=True, verbose_name='url статьи')    
    body = models.TextField(blank=True, null=True, verbose_name='Текст')
    keywords = models.CharField(max_length=255, blank=True, null=True, verbose_name='Ключевые слова')
    create_date = models.DateTimeField(auto_now_add=True, verbose_name='Дата создания')
    publish = models.DateTimeField(default=timezone.now, verbose_name='Дата публикации')
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='blog_posts', verbose_name='Автор')

    def get_absolute_url(self):
         return reverse('blog:post_detail', args=[self.slug])

    def get_rubric_status(self):
        return self.rubric.status

    class Meta:
        verbose_name = 'Статья'
        verbose_name_plural = 'Статьи'

    def __str__(self):
        return self.title


#view.py

from django.shortcuts import render
from django.views import generic
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from .models import Post

import pdb

class ListView(generic.ListView):
    
    queryset = Post.published.all()
    # queryset = Post.published.all().model.rubric.get_queryset().filter(status='published')
    template_name = 'blog/blog_list.html'
    context_object_name = 'posts'
    paginate_by = 3
    pdb.set_trace()

class DetailView(generic.DetailView):
    model = Post
    template_name = 'blog/blog_detail.html'
    context_object_name = 'post_detail'
  • Вопрос задан
  • 339 просмотров
Решения вопроса 1
ruchej
@ruchej Автор вопроса
Конструктор мебели. Пишу макросы для К3-Мебель
На данный момент нашёл такое решение.
Изменил во view.py строку
Post.published.all()
на
Post.published.filter(rubric__status="published")
Надеюсь это верное решение. По крайней мере, результат тот, что ожидал.
Решение нашёл в документации по django

Для сортировки по полю из другой модели, используйте синтаксис аналогичный тому, который используется при фильтрации по полям связанной модели. То есть, название поля, далее два нижних подчеркивания (__), и имя поля в новой модели, и так далее. Например:

Entry.objects.order_by('blog__name', 'headline')
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы