Django - الحصول على آخر كائن تم إنشاؤه، فلاتر في وقت واحد

StackOverflow https://stackoverflow.com/questions/1256190

سؤال

الاعتذار، أنا جديد تماما في Django و python.

لدي 2 أسئلة. أولا، كيف سأذهب حول الحصول على الكائن الأخير الذي تم إنشاؤه (أو أعلى PK) في قائمة الكائنات؟ على سبيل المثال، أعرف أنه يمكنني استخدام ما يلي للحصول على الكائن الأول:

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

هل هناك طريقة للحصول على طول القائمة. لقد حاولت 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)

ما هو بناء الجملة الصحيح، إن وجد؟

هل كانت مفيدة؟

المحلول

أنا لم أحاول هذا بعد، لكنني أنظر إلى آخر() المشغل على querysets.:

أحدث (field_name = none)

إرجاع أحدث كائن في الجدول، حسب التاريخ، باستخدام Field_Name المقدمة كحقل التاريخ.

يرجع هذا المثال أحدث إدخال في الجدول، وفقا لحقل Pub_Date:

Entry.Objects.latest ('pub_date')

إذا حددت META النموذجية get_latest_by، فيمكنك إخراج وسيطة field_name إلى الأحدث (). سيستخدم Django الحقل المحدد في get_latest_by افتراضيا.

مثل الحصول على ()، يثير الأحدث () لا يقوم بالكائن غير موجود مع المعلمات المحددة.

ملاحظة الأحدث () موجود بحتة للراحة والقراءة.

و ال مستندات نموذجية على get_latest_by:

get_latest_by.

Options.get_latest_by.

اسم deadfield أو datetimefield في النموذج. هذا يحدد الحقل الافتراضي لاستخدامه في أحدث طريقة للمدير النموذجي الخاص بك.

مثال:

get_latest_by = "order_date"

انظر المستندات للحصول على أحدث () لأكثر من ذلك.

تحرير: Wade لديه إجابة جيدة على مشغل Q ().

نصائح أخرى

هذا يعمل!

Model.objects.latest('field') - الحقل يمكن أن يكون معرف. سيكون ذلك هو أحدث هوية

لأكبر المفتاح الأساسي، جرب هذا:

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

لاحظ أن استخدام pk يعمل بغض النظر عن الاسم الفعلي للحقل المحدد بأنه المفتاح الأساسي الخاص بك.

منذ django 1.6 - آخر

last()

يعمل مثل first(), ، ولكن إرجاع الكائن الأخير في الاستعلام.

إرجاع الكائن الأخير المتطابق بواسطة QuerySet، أو None إذا لم يكن هناك كائن مطابق. إذا كان لدى Queryset لا يوجد طلب محدد، فسيتم طلب الاستعلام تلقائيا بواسطة المفتاح الأساسي.

list = List.objects.last() يمنحك الكائن الأخير الذي تم إنشاؤه

يمكنك استخدام طريقة العد () في استعلام تعيين الحصول على عدد العناصر.

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

حجج للتصفية هي "و" إد معا. إذا كنت بحاجة إلى القيام أو المرشحات إلقاء نظرة على كائنات Q.http://docs.djangoproject.com/en/dev/topics/db/topic/#complex-lookups-with-q-objects.

البديل للحصول على أحدث كائن تم إنشاؤه:

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

من الضروري إضافة assertionError للحالة عندما لا توجد عناصر في القائمة.

except AssertionError:
   ...

أنا أعمل على إصدار Django هو 1.4.22، ولا last ولا lastet يعمل. طريقي لحل مع الحد الأدنى من تحميل 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 بسهولة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top