2013-06-12 3 views
3

Имея модель po с ManyToManyField по имени Order.Django: получение элемента FIRST, принадлежащего объекту модели в ManyToManyField

Я рассматриваю несколько вариантов, в том числе следующих решений:

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

, но я не уверен, если это решение будет дорого в основном ее выполнение запроса для всей таблицы затем отфильтровать первый элемент (или нет?) ,

Второе решение

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

Это один, кажется, менее дорогой, но не работает, потому что его не возможно знать pk перед рукой.

Мне интересно, есть ли другие решения, которые получат ЛЮБОЙ элемент, имеющий отношение ManyToMany к объекту po?

+1

Ваше первое решение вполне оптимально. Он выполняет 'LIMIT' в запросе и, следовательно, довольно эффективен – karthikr

+0

Я бы предложил использовать' .first() '. Это не было частью ORM Django два года назад. Это должно быть быстрее, чем ваш первый вариант, и делать то, что вы хотели сделать во втором варианте. –

ответ

8

Это не правда, что с помощью [0] запрашивает всю таблицу. Как указано в документации, нарезка набора запросов передает LIMIT/OFFSET запрос базы данных, поэтому это совершенно эффективно.

4

.first() является новым в версии Django Development. См. Документы: https://docs.djangoproject.com/en/dev/ref/models/querysets/#first

До тех пор, пока он не станет стабильным, или вы запустите версию dev, придерживайтесь того, что у вас есть. QuerySet ленив, и «должен» использовать наименее эффективный подход. Если вы заинтересованы, проверьте журнал запросов в MySql General Log.

(из документации)

Note that first() is a convenience method, the following code sample is equivalent to the above example:

try:
p = Article.objects.order_by('title', 'pub_date')[0]
except IndexError:
p = None

+0

доступен с 1.6 – andi

Смежные вопросы