Django-条件过滤

时间:2019-01-03 10:25:03

标签: django django-queryset

我正在尝试显示每个用户的最新文章列表。

我的状况:如果某个用户已将他的一篇文章加为书签,我想为该用户显示最新的加书签的文章;否则,我想显示最新的文章。

models.py

class Article(models.Model):
    author = models.ForeignKey(User)
    bookmarked = models.BooleanField()

views.py

class ArticlesListView(ListView):
    context_object_name = 'articles'
    model = models.Article

    def get_queryset(self):
        articles = self.model.objects.order_by('-date')\
            .filter(pk__in=Article.objects.values('author__id')
            .annotate(
                latest=Case(

                    # Displaying the latest article
                    default=Max('id')
                )
            )
            .values('latest'))

在这段代码中,我试图使用Case expression来实现条件以检查我的条件,但是我却被困在如何制定条件的过程中……

更新

另一种方式:我尝试结合查询集

class ArticlesListView(ListView):
    context_object_name = 'articles'
    model = models.Article

    def get_queryset(self):
        lastest_articles = self.model.objects.order_by('-date')\
            .filter(pk__in=Article.objects.values('author__id')
            .annotate(max_id=Max('id')).values('max_id'))

        bookmarked_articles = self.model.objects.order_by('-date')\
            .filter(bookmarked=True)

        articles = bookmarked_articles | lastest_articles

但是,在我的最终查询中,每位作者获得多篇文章。我是否可以过滤此查询以使每个用户仅获得一篇文章,并优先处理已添加书签的文章?

1 个答案:

答案 0 :(得分:0)

使用您的上一个查询,这可能会起作用:

<a href="{{ myURL }}">Buy Now</a>

对于其他数据库后端,请改用latest_articles = self.model.objects.order_by('-date')\ .filter(pk__in=Article.objects.values('author__id') .annotate(max_id=Max('id')).values('max_id')) bookmarked_articles = self.model.objects.order_by('-date')\ .filter(bookmarked=True) articles = bookmarked_articles | latest_articles # OR both together articles = articles.order_by('-bookmarked')[0:1] # Select bookmark else latest article (SQLite命令首先为false)。