- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一些对象的 QuerySet
。对于每一个,我都希望用相关模型的最小值进行注释(在一些条件下加入,按日期排序)。我可以用 SQL 整齐地表达我想要的结果,但很好奇如何转换为 Django 的 ORM。
假设我有两个相关模型:Book
和 BlogPost
,每个模型都有一个指向 Author
的外键:
class Book(models.Model):
title = models.CharField(max_length=255)
genre = models.CharField(max_length=63)
author = models.ForeignKey(Author)
date_published = models.DateField()
class BlogPost(models.Model):
author = models.ForeignKey(Author)
date_published = models.DateField()
我正在尝试查找给定作者在他们撰写的每篇博文之后出版的第一本神秘书籍。在 SQL 中,这可以通过窗口很好地实现。
WITH ordered AS (
SELECT blog_post.id,
book.title,
ROW_NUMBER() OVER (
PARTITION BY blog_post.id ORDER BY book.date_published
) AS rn
FROM blog_post
LEFT JOIN book ON book.author_id = blog_post.author_id
AND book.genre = 'mystery'
AND book.date_published >= blog_post.date_published
)
SELECT id,
title
FROM ordered
WHERE rn = 1;
虽然上面的 SQL 很适合我的需要(如果需要我可以使用原始 SQL),但我很好奇如何在 QuerySet 中执行此操作。我有一个现有的 QuerySet,我想在其中进一步注释它
books = models.Book.objects.filter(...).select_related(...).prefetch_related(...)
annotated_books = books.annotate(
most_recent_title=...
)
我知道 Django 2.0 支持窗口函数,但我现在使用的是 Django 1.10。
我首先构建了一个 Q
对象来过滤出博文发布后出版的神秘书籍。
published_after = Q(
author__book__date_published__gte=F('date_published'),
author__book__genre='mystery'
)
从这里开始,我尝试将 django.db.models.Min
和其他 F
对象拼凑起来以实现我想要的结果,但没有成功。
注意:Django 2.0 引入了窗口表达式,但我目前使用的是 Django 1.10,并且很好奇如何使用那里可用的 QuerySet 功能来实现这一点。
最佳答案
也许使用.raw
并不是一个坏主意。检查 Window
class 的代码我们可以看到,本质上是组成一个SQL查询来实现“Windowing”。
一个简单的方法可能是使用 architect可以根据 the documentation 为 PostgreSQL 添加分区功能的模块.
另一个声称向 Django < 2.0 注入(inject) Window 功能的模块是 django-query-builder添加了一个 partition_by()
queryset 方法,可与 order_by
一起使用:
query = Query().from_table(
Order,
['*', RowNumberField(
'revenue',
over=QueryWindow().order_by('margin')
.partition_by('account_id')
)
]
)
query.get_sql()
# SELECT tests_order.*, ROW_NUMBER() OVER (PARTITION BY account_id ORDER BY margin ASC) AS revenue_row_number
# FROM tests_order
最后,您可以随时复制项目中的Window
类源代码或使用this alternate。窗口类代码。
关于python - 用有序相关模型的第一个值注释 QuerySet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48087980/
我正在这里使用这些模型开展一个小项目,我正在尝试找出一种方法来获取一组与当前经过身份验证的用户正在关注的用户关联的所有帖子。 但我不断得到: Cannot use QuerySet for "Prof
基本上我需要一种优雅的方式来执行以下操作:- obj1 = Model1.objects.select_related('model2').get(attribute1=value1) obj2 =
我想知道在删除查询集中的对象时迭代 Django 查询集的最佳方法是什么?例如,假设您有一个包含特定时间条目的日志表,并且您希望将它们存档,以便每 5 分钟不超过 1 个条目。我知道这可能是错误的,但
我今天发现我可以通过索引引用它们来访问查询集中的元素,即 queryset[n] .然而,紧接着我发现queryset[0]不返回与 queryset.first() 相同的记录.为什么会这样,并且是
我看到 QuerySet 类有 2 个不同的方法似乎服务于相同的目的(除非我弄错了):.__nonzero__ 和 .exists 。 (是的,我知道 .__nonzero__ 被 bool 使用。)
我怎样才能让下面的东西起作用? player = Player.objects.get(pk=player_id) game = Game.objects.get(pk=game_id) game_p
我正在使用 Django 1.6 并有如下问题陈述: 假设有两个模型,作者和书籍,那么作者和书籍模型显然是一对多的关系。 现在,我需要显示作者的数据,以便他写的每本书都有一行。 由于 UI 部分在主干
我真的不明白是什么导致了错误我检查了文档,这里有一个非常相似的例子是我的 views.py,我使用的应用程序下的 urls.py 包含,以及模板 View .py class SchoolListVi
几个月来我一直有一个间歇性的错误,我被卡住了!帮助表示赞赏。 class ContentFile(models.Model): """ Represents the metadata
我有几个模型,想要返回属于一个用户的所有模型的查询集,我想知道是否可以从多个模型返回一个查询集? 最佳答案 我假设您的意思是您想从每个模型返回属于用户的所有对象的单个查询集。 你需要一个查询集还是一个
我试图从两个没有外键关系的表中获取结果,只是想知道我使用的方法是否正确。 django.db import models django.contrib.auth.user import User cl
根据 Django REST framework documentation ,以下两个代码片段的行为应该相同。 class UserViewSet(viewsets.ViewSet): ""
我已经在models.py中编写了这些模型: 类User(models.Model): first_name = models.CharField(最大长度= 80) 类Skill(models.Mo
如何在单个表达式中从多对一关系的过滤结果中获取最新值以注释 Django QuerySet? 给定这个玩具模式: from django.db import models class Lorem(mo
我看到很多类似的查询,但似乎没有一个能满足我的需求, 我有一个这样的表: class BGPData(models.Model): subnet = models.ForeignKey(Sub
请问我为什么在我的模板中显示“fav”时收到此错误消息 QuerySet object has no attribute game_id 我试图更换 game_id来自 game , id_game但
我想从字面上将字符串添加到查询集对象。为什么,因为我将它发送到 JSON,将信息放在那里并使其可用而无需遍历查询集将其转换为自定义字典,这将非常好和干净。 我现在所拥有的: a_vote_set.ag
给定一个模型 class Entity(models.Model): identifier = models.IntegerField() created = models.Integ
我的一些对象管理器中有一个方法,它从数据库中获取数据: def products(self, offset=None) 如果没有 offset通过,它只是返回所有对象(大约 5000 个,没有那么多)
我在 StorySerializer 中的 GET/api/stories/169/ 上收到以下错误,如下评论中所述: AttributeError at /api/stories/169/ 'Man
我是一名优秀的程序员,十分优秀!