Django-从两个模型中按类别过滤视图

时间:2019-01-28 18:20:41

标签: python django filter view

我扩展了我的帖子模型,现在我的post_list_by_category函数显示了难看的列表。它显示了2个或更多不同的类别,其中仅应显示一个类别的帖子。 此应用程序使用2种类型的帖子模型,因此我需要以某种方式将它们放在一起,但也要按它们所属的类别进行过滤。有想法吗?

以前只能使用一种模型:

def post_list_by_category(request, pk):
    category = Category.objects.get(pk=pk)
    list_posts = Post.objects.get_queryset().order_by('-pk') 
    paginator = Paginator(list_posts, 10)  # Show 10 Posts per page
    page = request.GET.get('page')
    posts = paginator.get_page(page)
    return render(request, 'MyProject/post_list_by_category.html', {'posts': posts, 'category': category})

新功能不适用于两种型号:

def post_list_by_category(request, pk):
    category = Category.objects.get(pk=pk)
    list_posts = list(chain(Post.objects.get_queryset().order_by('-pk'), Post_Extra.objects.get_queryset().order_by('-pk')))
    paginator = Paginator(list_posts, 10)  # Show 10 Posts per page
    page = request.GET.get('page')
    posts = paginator.get_page(page)
    return render(request, 'MyProject/post_list_by_category.html', {'posts': posts, 'category': category})

models.py

帖子:

class Post(models.Model):
author = models.ForeignKey(User, on_delete=models.CASCADE)
title = models.CharField(verbose_name="Post Title", max_length=25)
content = models.TextField(verbose_name="Post Content", max_length=5000)
category = models.ForeignKey(Category, verbose_name="Category", on_delete=models.CASCADE, null=True)

....

Post_Extra:

class PostExtra(models.Model):
author = models.ForeignKey(User, on_delete=models.CASCADE)
title = models.CharField(verbose_name="Post Title", max_length=25)
content = models.TextField(verbose_name="Post Content", max_length=10000)
category = models.ForeignKey(Category, verbose_name="Category", on_delete=models.CASCADE, null=True)

... 其他字段不是必需的,但有差异

类别 ...

class Category(models.Model):
    title = models.CharField(max_length=30, verbose_name="Title")
    description = models.TextField(max_length=175, null=True, blank=True)

... 问候

1 个答案:

答案 0 :(得分:0)

问题解决了:

def post_list_by_category(request, pk):
    category = Category.objects.get(pk=pk)
    list_posts = list(chain(Post.objects.filter(category_id=pk).order_by('-pk'), PostExtra.objects.filter(category_id=pk).order_by('-pk')))
    paginator = Paginator(list_posts, 10)  # Show 10 Posts per page
    page = request.GET.get('page')
    posts = paginator.get_page(page)
    return render(request, 'MyProject/post_list_by_category.html', {'posts': posts, 'category': category})