首页 > 解决方案 > 在Django中按类别排序

问题描述

这样的问题:我制作了一个侧边栏,其中有一个类别列表,您需要更改 def get_queryset 以便当您单击一个类别时,会显示该类别的所有帖子。我需要将 public = True 和 .order_by ('- data') 存储在 def get_queryset

视图.py

class CategoryFilterView(LoginRequiredMixin, PermissionRequiredMixin, DetailView):
model = Post
template_name = 'news.html'
context_object_name = 'news'
permission_required = ('news.view_post', 'news.view_category')

def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    return context

def get_queryset(self):
    return Post.objects.filter(public=True).order_by('-data')

模型.py

class Category(models.Model):
category_name = models.CharField(max_length=64, unique=True)
subscribers = models.ManyToManyField(User, blank=True, null=True)


class Meta:
    verbose_name = 'Категория'
    verbose_name_plural = 'Категории'

def __str__(self):
    return self.category_name

class Post(models.Model):
PostAuthor = models.ForeignKey(Author, on_delete=models.CASCADE, verbose_name='Автор поста')

PostNews = 'PN'
PostArticle = 'PA'

# «статья» или «новость»
POSITIONS = [
    (PostArticle, 'Статья'),
    (PostNews, 'Новость'),
]

postCategory = models.ManyToManyField(Category, verbose_name='Категория поста',  through='PostCategory')
title = models.CharField(max_length=50, verbose_name='Название')
positions = models.CharField(max_length=2, choices=POSITIONS, default=PostArticle, verbose_name='Тип поста')
category_id = models.ForeignKey(Category, verbose_name='Категория', null=True, on_delete=models.CASCADE, related_name='category_id')
data = models.DateTimeField(auto_now_add=True, verbose_name='Дата создания')
data_update = models.DateTimeField(auto_now=True, verbose_name='Дата редактирования')
photo = models.ImageField(upload_to='photos/%Y/%m/%d/', verbose_name='Фото', blank=True, default='/photos/def/1.jpg/')
previewName = models.CharField(max_length=128, verbose_name='Превью поста')
text = models.TextField(verbose_name='Текст поста')
rating = models.SmallIntegerField(default=0, verbose_name='Рейтинг')
public = models.BooleanField(default=True, verbose_name='Опубликовано')

def like(self):
    self.rating +=1
    self.save()

def dislike(self):
    self.rating -=1
    self.save()

def preview(self):
    return self.text[0:124] + '...'

def __str__(self):
    return self.title

class Meta:
    verbose_name = 'Пост'
    verbose_name_plural = 'Посты'

def get_absolute_url(self):
    return f'/news/{self.pk}'

标签: pythonhtmldjangodjango-modelsdjango-views

解决方案


你尝试使用 Q 对象进行过滤:

category = self.request.POST['category'] # this comes from frontend

filter_object = Q()

if category != '':
 filter_object &= Q(
  postCategory__category_name__icontains = category)

annex_data = Posts.objects.values('postCategory_id').filter(filter_object)

推荐阅读