Django:在ManyToManyField中获取属于模型对象的第一个项目

Posted

技术标签:

【中文标题】Django:在ManyToManyField中获取属于模型对象的第一个项目【英文标题】:Django: getting FIRST item that belongs to a model object in a ManyToManyField 【发布时间】:2013-06-08 18:35:42 【问题描述】:

有一个模型po 和一个名为ManyToManyFieldOrder

我正在考虑一些选项,包括以下解决方案:

po.Orders.all()[0].itemname

但我不确定这个解决方案是否会很昂贵(或不会?)基本上它查询整个表然后过滤掉第一个项目。

第二个解决方案

po.Orders.get(pk=1).itemname

这个看起来更便宜,但不起作用,因为它不可能事先知道pk

我想知道是否有其他解决方案可以获得与po 对象具有多对多关系的任何项目?

【问题讨论】:

您的第一个解决方案非常理想。它对查询执行LIMIT,因此非常有效 我建议使用.first()。两年前,这不是 Django 的 ORM 的一部分。这应该比您的第一个选项更快,并且在您的第二个选项中做您想做的事情。 【参考方案1】:

使用[0] 查询整个表是不正确的。如文档中所述,对查询集进行切片会将 LIMIT/OFFSET 传递给数据库查询,因此非常有效。

【讨论】:

【参考方案2】:

.first() 是 Django 开发版本中的新功能。查看文档:https://docs.djangoproject.com/en/dev/ref/models/querysets/#first

直到它变得稳定,或者你运行开发版本,坚持你所拥有的。 QuerySet 是惰性的,并且“应该”采用最少工作的方法。如果您担心,请查看mysql General Log 中的查询日志。

(来自文档)

注意 first() 是一个方便的方法,下面的代码示例 相当于上面的例子:

尝试: p = Article.objects.order_by('title', 'pub_date')[0] 除了 IndexError: p = 无

【讨论】:

以上是关于Django:在ManyToManyField中获取属于模型对象的第一个项目的主要内容,如果未能解决你的问题,请参考以下文章

关于 django ManyToManyField

如何在 Django Admin 中获取 ManyToManyField 的当前值?

如何在 Django 中向 ManyToManyField 添加条目?

Django ManyToManyField 关系

Django 管理员:list_editable 中的 ManyToManyField?

如何在 Django Admin 中访问 ManyToManyField 的两个方向?