【问题标题】:Filter and sort results over multiple tables in Django在 Django 中的多个表上过滤和排序结果
【发布时间】:2018-03-02 21:42:45
【问题描述】:

我有两个模型页面和帖子,其中页面可以有多个帖子。用户每天将使用相同的 URL 共享多个帖子。因此,我需要每天获取最多共享 URL 的提要以及当天的帖子。有没有办法在 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}]>

【问题讨论】:

  • 检查这是否适合您pubs = Post.objects.filter(created_at__date=date.today()).values('page__url','created_at').annotate(num_posts=Count('page__url'))'.order_by('created_at')

标签: django django-models django-queryset django-orm


【解决方案1】:

查看Prefetch()prefetch_related() 以返回相关对象的查询集。

你会做类似pages = Page.objects.all().prefetch_related(Prefetch('post', queryset=Post.objects.filter(&lt;date filter&gt;), to_attr='posts'))的事情

然后您将访问页面帖子,例如

for page in pages:
    for post in page.posts:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-25
    • 1970-01-01
    • 2018-10-10
    • 2011-09-19
    • 2015-11-04
    • 2018-10-20
    • 2011-08-19
    • 1970-01-01
    相关资源
    最近更新 更多