在Django中对多个表进行筛选和排序
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Django中对多个表进行筛选和排序相关的知识,希望对你有一定的参考价值。
我有两个模型Page和Post,其中Page可以有多个帖子。用户将使用相同的URL每天共享多个帖子。因此,我需要每天获取最多共享网址的Feed,以及当天的帖子。有没有办法在Django ORM中执行此操作?
class Page(models.Model):
url = models.URLField()
class Post(models.Model):
page = models.ForeignKey(‘Page', on_delete=models.DO_NOTHING, null=True, blank=True, related_name='posts')
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
我最终得到了这个,它给了我最多的共享网址,但现在我无法弄明白如何获取所有相关的帖子,并按created_at
排序
Post.objects.filter(created_at__date=date.today()).values('page__id').annotate(num_shares=Count('page__id')).order_by('-num_shares')
<PostQuerySet [{'page__id': 2, 'num_shares': 6}, {'page__id': 1, 'num_shares': 5}]>
答案
查看Prefetch()
和prefetch_related()
以返回相关对象的查询集。
你会做像pages = Page.objects.all().prefetch_related(Prefetch('post', queryset=Post.objects.filter(<date filter>), to_attr='posts'))
这样的事情
然后,您将访问页面帖子,如
for page in pages:
for post in page.posts:
以上是关于在Django中对多个表进行筛选和排序的主要内容,如果未能解决你的问题,请参考以下文章
如何在搜索栏中对对象进行筛选后,如何对层次结构中的对象进行排序?