【问题标题】:Sorting by category in Django在Django中按类别排序
【发布时间】:2021-09-02 18:15:45
【问题描述】:

这样的问题:我做了一个侧边栏,里面有一个类别列表,你需要改变 def get_queryset 的方式,当你点击一个类别时,这个类别的所有帖子都会显示出来。我需要将 public = True 和 .order_by ('- data') 存储在 def get_queryset 中

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

models.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}'

【问题讨论】:

    标签: python html django django-models django-views


    【解决方案1】:

    你尝试使用 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)
    

    【讨论】:

    • 您好,感谢您的来信,但不幸的是我需要它通过 def_queryset @juan francisco quiñones romero
    猜你喜欢
    • 1970-01-01
    • 2019-08-20
    • 1970-01-01
    • 2012-03-17
    • 2015-07-05
    • 2018-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多