2009-08-10 11 views
26

謝罪、私はDjangoとPythonを初めて熟知しています。Django - 最後のオブジェクトの取得、同時フィルタの取得

私には2つの質問があります。まず、オブジェクトのリストで最後に作成されたオブジェクト(または最高のpk)を取得するにはどうすればよいでしょうか?

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

List.objectsの長さを取得する方法はあります:たとえば、私が最初のオブジェクトを取得するには、次の使用できることを知っていますか?私はList.objects.lengthを試したが、役に立たなかった。

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

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) 

あれば、正しい構文は何ですか?

答えて

42

私はまだこれを試していないが、私はQuerySetslatest()オペレータを見たい:

最新(FIELD_NAME =なし)

を の表に、最新のオブジェクトを返します。日付フィールドとしてフィールド名 を使用して、日付別に表示します。

この例では、 PUB_DATEフィールドに応じて、テーブル内の最新のエントリ を返します。

Entry.objects.latest( 'PUB_DATE')

モデルのメタは get_latest_byを指定する場合は、することができます最新の()への field_name引数をそのままにします。 Djangoはデフォルトで get_latest_byで指定されたフィールドを使用します。オブジェクトが が指定したパラメータを用いて存在していない場合

などを取得する()、最新の() のDoesNotExistを発生させます。

最新()は の便宜と可読性のためだけに存在します。

そしてmodel docs on get_latest_by

get_latest_by

Options.get_latest_by

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

例:多くのための

get_latest_by = "ORDER_DATE"

が(最新のためのドキュメントを参照してください)。

編集:WadeはQ()演算子にうまく対応しています。関係なく、あなたの主キーとして定義されたフィールドの実際の名前のpk作品を使用していること

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

注:最大の主キーの

+0

ありがとう、ヒュー!私はこれも調べます。 – zdyn

+0

恐ろしい答え=)ありがとう! –

+0

@hughdbrownどのように最新のDjangoテンプレートを使用できますか? – MegaBytes

12

、これを試してみてください。

20

この作品は!

Model.objects.latest('field') - フィールドにはidを指定できます。リスト内のアイテムがない場合のためにAssertionErrorがを追加する必要がある

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

:それが作成され、最新のオブジェクトの最新のid

+8

私はあなたの前に4ヶ月前に書いた答えのように見えますか? – hughdbrown

+4

あなたは、私がまだこれを試していないと確信を持っていません。この答えはあります。 –

0

選択肢となります。ジャンゴ1.6以降

except AssertionError: 
    ... 
+2

これはデータベースからすべてのモデルをロードします。 – wieczorek1990

9

- 最後

last()

first()のように動作しますが、クエリセット内の最後のオブジェクトを返します。

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

list = List.objects.last()あなたは私がDjangoのバージョンに取り組んでいます最後のオブジェクトが

0

を作成できます1.4.22、lastlastetどちらが働いているです。 最小デシベルの負荷を解決するための私の方法は次のようである:

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で最後のオブジェクトを取得することができるはずです。

関連する問題