如何正确过滤Django中的类别?

时间:2020-06-02 14:33:20

标签: django


我的Django博客中有一个名为“ person”的类别函数。
在我的博客中,每个帖子(文章)都有1〜多个类别,当我单击其中的1个类别时,它将显示该类别下的所有帖子。
但是,对于某些类别,尤其是只有英文字母的类别(例如“史蒂夫”),请多次显示相同的帖子。
我认为使用 objects.filter 对其进行过滤存在一些问题,但不确定到底是什么问题。
您对此问题有解决方案吗?

以下是我的代码。

models.py

class Category(models.Model):
    person = models.CharField(max_length=20)
    description = models.TextField()
    slug = models.SlugField()
    def __str__(self):
        return self.person

class Post(models.Model):
        book_title = models.CharField(max_length=255)
        author = models.CharField(max_length=255)
        book_link = models.CharField(max_length=255)
        source = models.TextField()
        source_link = models.CharField(max_length=255)
        created_on = models.DateTimeField(auto_now_add=True)
        last_modified = models.DateTimeField(auto_now=True)
        categories = models.ManyToManyField("Category", related_name="posts")

views.py

def blog_category(request, category):
    posts = Post.objects.filter(categories__person__contains=category).order_by(
    "-created_on"
    )

    context = {"category": category, "posts": posts}
    return render(request, "blog_category.html", context)

1 个答案:

答案 0 :(得分:0)

如果同一getQueryString所属的多个Post匹配(因此包含查询),则有可能多次返回相同的Category。您只能使用.distinct() [Django-doc]来检索每个帖子一次:

def blog_category(request, category):
    posts = Post.objects.filter(
        categories__person__contains=category
    ).order_by('-created_on').distinct()

    context = {'category': category, 'posts': posts}
    return render(request, 'blog_category.html', context)