python - 在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}'
解决方案
你尝试使用 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)
推荐阅读
- html - 使用 HTML 和 CSS 悬停下拉菜单
- sql - LEFT JOIN on max id in where 子句
- excel - Excel - 迭代计算收敛问题/无限循环
- cors - tensorflow_model_server 访问控制允许来源
- firebase - Firebase:获取上次用户令牌刷新的时间戳?
- visual-studio-2012 - 在 CLI/C++ 中不调用派生方法
- javascript - 无法在 Contact Form 7 Plugin 上停止带有锚标记的表单提交
- c# - 无法得到我想要的字符串?
- hadoop - shell脚本中beeline命令的返回码
- vba - 强制性数据输入框