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

40P*_*lot 4 django many-to-many model

拥有一个po带有ManyToManyField被叫的模型Order.

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

po.Orders.all()[0].itemname
Run Code Online (Sandbox Code Playgroud)

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

二解决方案

po.Orders.get(pk=1).itemname
Run Code Online (Sandbox Code Playgroud)

这个似乎更便宜,但不起作用,因为它不可能知道pk前手.

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

Dan*_*man 9

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


Fra*_*bot 6

.first()是Django Development版本的新功能.请参阅文档:https://docs.djangoproject.com/en/dev/ref/models/querysets/#first

直到它稳定,或者你运行开发版本,坚持你拥有的东西.QuerySet是懒惰的,"应该"采用最少工作的方法.如果您担心,请检查MySql常规日志中的查询日志.

(来自文档)

注意first()是一种方便的方法,下面的代码示例等同于上面的例子:

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