আমি একটি মডেলের শেষ 10 টি উদাহরণ নিতে চাই এবং এই কোডটি পেতে চাই:
Model.objects.all().order_by('-id')[:10]
এটি কি সত্য যে প্রথমে সমস্ত দৃষ্টান্তগুলি বেছে নিয়ে, এবং তারপরে কেবল 10 টি সর্বশেষে নেওয়া হয়? এর চেয়ে কার্যকর কোন পদ্ধতি আছে কি?
আমি একটি মডেলের শেষ 10 টি উদাহরণ নিতে চাই এবং এই কোডটি পেতে চাই:
Model.objects.all().order_by('-id')[:10]
এটি কি সত্য যে প্রথমে সমস্ত দৃষ্টান্তগুলি বেছে নিয়ে, এবং তারপরে কেবল 10 টি সর্বশেষে নেওয়া হয়? এর চেয়ে কার্যকর কোন পদ্ধতি আছে কি?
উত্তর:
জ্যাঙ্গো ক্যোয়ারসেটগুলি অলস। এর অর্থ যখন আপনি নির্দিষ্টভাবে ফলাফলের জন্য জিজ্ঞাসা করবেন কেবল তখনই কোনও ক্যোয়ারী ডাটাবেসগুলিতে আঘাত করবে।
সুতরাং আপনি কোনও ক্যোয়ারির ফলাফল মুদ্রণ বা প্রকৃতপক্ষে ব্যবহার না করা পর্যন্ত আপনি কোনও ডাটাবেস অ্যাক্সেস ছাড়াই আরও ফিল্টার করতে পারবেন।
আপনি নীচে দেখতে পাচ্ছেন যে আপনার কোডটি কেবলমাত্র শেষ 10 টি আইটেম আনার জন্য একটি বর্গ কোয়েরি কার্যকর করে।
In [19]: import logging
In [20]: l = logging.getLogger('django.db.backends')
In [21]: l.setLevel(logging.DEBUG)
In [22]: l.addHandler(logging.StreamHandler())
In [23]: User.objects.all().order_by('-id')[:10]
(0.000) SELECT "auth_user"."id", "auth_user"."username", "auth_user"."first_name", "auth_user"."last_name", "auth_user"."email", "auth_user"."password", "auth_user"."is_staff", "auth_user"."is_active", "auth_user"."is_superuser", "auth_user"."last_login", "auth_user"."date_joined" FROM "auth_user" ORDER BY "auth_user"."id" DESC LIMIT 10; args=()
Out[23]: [<User: hamdi>]
আসলে আমি মনে করি যে LIMIT 10
এটি ডাটাবেসগুলিতে জারি করা হবে যাতে পাইথনগুলিতে নয় তবে ডাটাবেসে কাটা কাটা ঘটে।
দেখুন সীমিত-querysets আরও তথ্যের জন্য।
দেখে মনে হচ্ছে যে প্রশ্নের সমাধানটি আর জ্যাঙ্গো ১.7 এর সাথে কাজ করে না এবং একটি ত্রুটি উত্থাপন করে: "একবার স্লাইস নেওয়া হয়ে গেলে কোয়েরিকে পুনরায় অর্ডার করতে পারবেন না"
ডকুমেন্টেশন অনুসারে https://docs.djangoproject.com/en/dev/topics/db/queries/#limiting-querysets জোর করে পাইথন স্লাইস সিনট্যাক্সের "পদক্ষেপ" পরামিতি কোয়েরিকে মূল্যায়ন করে। এটি এইভাবে কাজ করে:
Model.objects.all().order_by('-id')[:10:1]
তবুও আমি অবাক হই যে এসকিউএল বা পাইথনগুলিতে সীমাটি কার্যকর করা হলে পুরো ফলাফলের অ্যারেরটি কেটে ফেলা হয়। অ্যাপ্লিকেশন মেমরির বিশাল তালিকা পুনরুদ্ধার করার ভাল নেই।
হ্যাঁ. আপনি যদি অবজেক্টের একটি সীমাবদ্ধ উপসেট আনতে চান তবে আপনি নীচের কোডটি সহ করতে পারেন:
উদাহরণ:
obj=emp.objects.all()[0:10]
শুরু 0 টি চ্ছিক, তাই
obj=emp.objects.all()[:10]
উপরের কোডটি প্রথম 10 টি উদাহরণ দেয়।
অন্যান্য দরকারী উত্তরগুলির সংযোজন এবং পর্যবেক্ষণ হিসাবে, এটি লক্ষণীয় যে আসলে [:10]
কাটা হিসাবে কাজ করা তালিকার প্রথম 10 উপাদানকে ফিরিয়ে দেবে , শেষ 10 নয় ...
শেষ 10 পেতে আপনার [-10:]
পরিবর্তে করা উচিত ( এখানে দেখুন )। এই সাহায্য করবে আপনি ব্যবহার এড়াতে order_by('-id')
সঙ্গে -
উপাদান বিপরীত।
Product.objects.filter(~Q(price=0))[-5:]
আমার জন্য একই ত্রুটি ঘটায় : "নেতিবাচক সূচী সমর্থিত নয়।"