我正在尝试显示每个用户的最新文章列表。
我的状况:如果某个用户已将他的一篇文章加为书签,我想为该用户显示最新的加书签的文章;否则,我想显示最新的文章。
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
但是,在我的最终查询中,每位作者获得多篇文章。我是否可以过滤此查询以使每个用户仅获得一篇文章,并优先处理已添加书签的文章?
答案 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)。