gpt4 book ai didi

Django查询集根据日期返回外键中每个项目的第一个

转载 作者:行者123 更新时间:2023-12-04 14:47:15 24 4
gpt4 key购买 nike

需要为每个作者(与外键相关)获取第一本书(按日期字段)的查询集……是否有 Django ORM 方法来执行此操作(没有首选但可接受的自定义 SQL)

*编辑:请注意,仅使用像 Postgresql 这样的现代开源后端的答案是可以接受的……仍然基于 ORM 的解决方案优于纯自定义 sql 查询)

Models
class Book(Model):
date = Datefield()
author = ForeignKey(Author)

class Author(Model):
name = CharField()


Book.objects.filter(??)

最佳答案

如果您使用 PostgreSQL 或其他支持 DISTINCT ON 的数据库后端有一个很好的解决方案:

Books.objects.order_by('author', '-date').distinct('author')

否则我不知道只有一个查询的解决方案。但是你可以试试这个:
from django.db.models import Q, Max
import operator

books = Book.objects.values('author_id').annotate(max_date=Max('date'))
filters = reduce(operator.or_, [(Q(author_id=b['author_id']) &
Q(date=b['max_date'])) for b in books])
queryset = Books.objects.filter(filters)

通过 .values() 和 .annotate() 的组合,我们按作者分组并注释该作者所有书籍的最新日期。但结果是一个字典而不是一个查询集。
然后我们构建一个 SQL 语句,如 WHERE author_id=X1 AND date=Y1 OR author_id=X2 AND date=Y2... .现在第二个查询很容易。

关于Django查询集根据日期返回外键中每个项目的第一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14234971/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com