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

Django:获取属于ManyToManyField中的模型对象的第一项,django,model,many-to-many,Django,Model,Many To Many,拥有一个名为订单的ManyToManyField型号po 我正在考虑一些方案,包括以下解决方案: po.Orders.all()[0].itemname 但是我不确定这个解决方案是否会很昂贵(或者不是?),基本上是查询整个表,然后过滤掉第一项 第二种解决方案 po.Orders.get(pk=1).itemname 这个似乎不太贵,但不起作用,因为不可能事先知道pk 我想知道是否有其他解决方案可以获得任何与po对象具有多个关系的项?.first()在Django开发版本中是新的。见文件: 直

拥有一个名为
订单
ManyToManyField
型号
po

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

po.Orders.all()[0].itemname
但是我不确定这个解决方案是否会很昂贵(或者不是?),基本上是查询整个表,然后过滤掉第一项

第二种解决方案

po.Orders.get(pk=1).itemname
这个似乎不太贵,但不起作用,因为不可能事先知道
pk

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

.first()
在Django开发版本中是新的。见文件:

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

(来自文件)

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

试试看:
p=Article.objects.order_by('title','pub_date')[0]
除索引器外:
p=无


使用
[0]
查询整个表不是真的。正如文档中所述,对查询集进行切片会向数据库查询传递一个限制/偏移量,因此这是非常有效的。

您的第一个解决方案非常理想。它对查询进行了
限制,因此非常有效。建议使用
.first()
。这不是两年前Django的ORM的一部分。这应该比你的第一个选择更快,并且做你在第二个选择中想要做的事情。