4

po有一个ManyToManyField名为的模型Order

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

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

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

第二种解决方案

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

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

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

4

2 回答 2

9

It's not true that using [0] queries the whole table. As stated in the documentation, slicing a queryset passes a LIMIT/OFFSET to the database query, so this is perfectly efficient.

于 2013-06-12T15:17:42.790 回答
6

.first()在 Django Development 版本中是新的。请参阅文档: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 = None

于 2013-06-12T15:16:14.807 回答