在Django中对多个表进行筛选和排序

问题描述 投票:0回答:1

我有两个模型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}]>
django django-models django-queryset django-orm
1个回答
0
投票

查看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:
© www.soinside.com 2019 - 2024. All rights reserved.