4

と呼ばれるモデルpoを持つ。ManyToManyFieldOrder

次の解決策を含むいくつかのオプションを検討しています。

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

しかし、このソリューションが高価になるかどうかはわかりません (またはそうではありませんか?) 基本的に、テーブル全体のクエリを実行してから、最初の項目を除外します。

2 番目の解決策

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

これは安価に見えますが、事前に知ることができないため機能しませんpk

オブジェクトと ManyToMany 関係を持つアイテムを取得する他のソリューションがあるかどうか疑問に思っていpoますか?

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 開発バージョンの新機能です。ドキュメントを参照してください: 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 = なし

于 2013-06-12T15:16:14.807 に答える