web-dev-qa-db-ja.com

Django-作成された最後のオブジェクトの取得、同時フィルター

申し訳ありませんが、私はDjangoおよびPython。

2つの質問があります。最初に、オブジェクトのリストで最後に作成されたオブジェクト(または最も高いpk)を取得するにはどうすればよいですか?たとえば、次を使用して最初のオブジェクトを取得できることを知っています。

list = List.objects.all()[0]

List.objectsの長さを取得する方法はありますか? List.objects.lengthを試しましたが、役に立ちませんでした。

第二に、同時フィルターを作成したり、リストを組み合わせたりすることは可能ですか?次に例を示します。

def findNumber(request, number)
    phone_list = Numbers.objects.filter(cell=number)

上記のようなものが欲しいのですが、もっと好きです:

def findNumber(request, number)
    phone_list = Numbers.objects.filter(cell=number or home_phone=number)

正しい構文はありますか?

36
zdyn

私はまだこれを試していませんが、- QuerySetslatest() 演算子を見ます。

latest(field_name = None)

日付フィールドとして指定されたfield_nameを使用して、日付ごとにテーブル内の最新のオブジェクトを返します。

この例は、pub_dateフィールドに従って、テーブル内の最新のエントリを返します。

Entry.objects.latest( 'pub_date')

モデルのMetaがget_latest_byを指定している場合、latest()のfield_name引数を省略できます。 Djangoは、デフォルトでget_latest_byで指定されたフィールドを使用します。

Get()と同様に、latest()は、指定されたパラメーターを持つオブジェクトが存在しない場合にDoesNotExistを発生させます。

Latest()は純粋に利便性と読みやすさのために存在しています。

そして get_latest_byのモデルドキュメント

get_latest_by

Options.get_latest_by

モデル内のDateFieldまたはDateTimeFieldの名前。これは、モデルマネージャーの最新のメソッドで使用するデフォルトフィールドを指定します。

例:

get_latest_by = "order_date"

詳細については、latest()のドキュメントを参照してください。

編集:ウェイドはQ()演算子に関する良い答えを持っています。

56
hughdbrown

これは動作します!

Model.objects.latest('field')-フィールドにはidを指定できます。それが最新のIDになります

31
Harry

Since Django 1.6-last

last()

first()と同様に機能しますが、クエリセットの最後のオブジェクトを返します。

クエリセットで最後に一致したオブジェクトを返します。一致するオブジェクトがない場合はNoneを返します。クエリセットに順序が定義されていない場合、クエリセットは主キーによって自動的に順序付けされます。

list = List.objects.last()は、最後に作成されたオブジェクトを提供します

15
punkrockpolly

最大の主キーについては、これを試してください:

List.objects.order_by('-pk')[0]

pkを使用すると、主キーとして定義されたフィールドの実際の名前に関係なく機能することに注意してください。

15
jcdyer

クエリセットでcount()メソッドを使用して、アイテムの数を取得できます。

list = List.objects.all()
list.count()

フィルタする引数は、「AND」されます。 ORフィルターはQオブジェクトを見ます。 http://docs.djangoproject.com/en/dev/topics/db/queries/#complex-lookups- with-q-objects

3
Wade

作成された最新のオブジェクトの代替:

List.objects.all()[List.objects.count()-1]

リストにアイテムがない場合は、AssertionErrorを追加する必要があります。

except AssertionError:
   ...
0
RolandoAmir

私はDjangoバージョンは1.4.22で、lastlastetも動作していません。最小のDB負荷で解決する私の方法は次のようなものです:

latest = lambda model_objects, field : model_objects.values_list( field, flat = True ).order_by( "-" + field )[ 0 ]
latest_pk = latest( List.objects, "pk" )

この関数は、入力としてquery_setを受け入れます。

以下を実行することにより、この関数を動的にバインドできます。

import types
List.objects.latest = types.MethodType( latest, List.objects )

その後、この最新のpkで最後のオブジェクトを簡単に取得できるはずです。

0
Sphynx-HenryAY