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
和一个名为ManyToManyField
的Order
。
我正在考虑一些选项,包括以下解决方案:
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 Admin 中获取 ManyToManyField 的当前值?
如何在 Django 中向 ManyToManyField 添加条目?