জ্যাঙ্গো - সীমাবদ্ধ ক্যোয়ারির ফলাফল


200

আমি একটি মডেলের শেষ 10 টি উদাহরণ নিতে চাই এবং এই কোডটি পেতে চাই:

 Model.objects.all().order_by('-id')[:10]

এটি কি সত্য যে প্রথমে সমস্ত দৃষ্টান্তগুলি বেছে নিয়ে, এবং তারপরে কেবল 10 টি সর্বশেষে নেওয়া হয়? এর চেয়ে কার্যকর কোন পদ্ধতি আছে কি?


উত্তর:


304

জ্যাঙ্গো ক্যোয়ারসেটগুলি অলস। এর অর্থ যখন আপনি নির্দিষ্টভাবে ফলাফলের জন্য জিজ্ঞাসা করবেন কেবল তখনই কোনও ক্যোয়ারী ডাটাবেসগুলিতে আঘাত করবে।

সুতরাং আপনি কোনও ক্যোয়ারির ফলাফল মুদ্রণ বা প্রকৃতপক্ষে ব্যবহার না করা পর্যন্ত আপনি কোনও ডাটাবেস অ্যাক্সেস ছাড়াই আরও ফিল্টার করতে পারবেন।

আপনি নীচে দেখতে পাচ্ছেন যে আপনার কোডটি কেবলমাত্র শেষ 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>]

আমি এটি মঙ্গোডিবিতে চেষ্টা করেছিলাম এবং এটিতে বলা হয় যে নির্বাচনগুলি সমর্থিত নয়। মঙ্গোডিবিতে এটি কীভাবে করবেন?
winux

@ উইনাক্স যেহেতু এটি জ্যাঙ্গো-নির্দিষ্ট, আপনার মনে হচ্ছে মোঙ্গো / নোএসকিউএল-টাইপ ডেটাবেসগুলির সাথে বিশেষত কাজ করার জন্য জ্যাঙ্গো স্থাপনের জন্য আপনার প্রয়োজন হতে পারে sounds এটি স্ট্যান্ডার্ড জ্যাঙ্গো ওআরএম সেটআপ সম্পর্কিত আমার অভিজ্ঞতার একটি সাধারণ সেটআপ নয়।
বেনামে কাপুরুষ 21

38

আসলে আমি মনে করি যে LIMIT 10এটি ডাটাবেসগুলিতে জারি করা হবে যাতে পাইথনগুলিতে নয় তবে ডাটাবেসে কাটা কাটা ঘটে।

দেখুন সীমিত-querysets আরও তথ্যের জন্য।


নোট করুন যে এটি ক্যোয়ারসেটগুলির জন্য কাজ করবে না যেগুলি ফিল্টারিংয়েরও দরকার, কারণ আপনি কাটার পরে ফিল্টার করতে পারবেন না।
মাইক 'পোম্যাক্স' কামারম্যানস

2
সুতরাং এটি কাটা আগে ফিল্টার। ধন্যবাদ লিঙ্কের জন্য প্রিয়!
ভাইচেজ

13

দেখে মনে হচ্ছে যে প্রশ্নের সমাধানটি আর জ্যাঙ্গো ১.7 এর সাথে কাজ করে না এবং একটি ত্রুটি উত্থাপন করে: "একবার স্লাইস নেওয়া হয়ে গেলে কোয়েরিকে পুনরায় অর্ডার করতে পারবেন না"

ডকুমেন্টেশন অনুসারে https://docs.djangoproject.com/en/dev/topics/db/queries/#limiting-querysets জোর করে পাইথন স্লাইস সিনট্যাক্সের "পদক্ষেপ" পরামিতি কোয়েরিকে মূল্যায়ন করে। এটি এইভাবে কাজ করে:

Model.objects.all().order_by('-id')[:10:1]

তবুও আমি অবাক হই যে এসকিউএল বা পাইথনগুলিতে সীমাটি কার্যকর করা হলে পুরো ফলাফলের অ্যারেরটি কেটে ফেলা হয়। অ্যাপ্লিকেশন মেমরির বিশাল তালিকা পুনরুদ্ধার করার ভাল নেই।


এমনকি এই সমাধানটি django> = 1.8 পরীক্ষিত সাথে কাজ করে না।
sonus21

3

হ্যাঁ. আপনি যদি অবজেক্টের একটি সীমাবদ্ধ উপসেট আনতে চান তবে আপনি নীচের কোডটি সহ করতে পারেন:

উদাহরণ:

obj=emp.objects.all()[0:10]

শুরু 0 টি চ্ছিক, তাই

obj=emp.objects.all()[:10]

উপরের কোডটি প্রথম 10 টি উদাহরণ দেয়।


1

অন্যান্য দরকারী উত্তরগুলির সংযোজন এবং পর্যবেক্ষণ হিসাবে, এটি লক্ষণীয় যে আসলে [:10]কাটা হিসাবে কাজ করা তালিকার প্রথম 10 উপাদানকে ফিরিয়ে দেবে , শেষ 10 নয় ...

শেষ 10 পেতে আপনার [-10:]পরিবর্তে করা উচিত ( এখানে দেখুন )। এই সাহায্য করবে আপনি ব্যবহার এড়াতে order_by('-id')সঙ্গে -উপাদান বিপরীত।


1
আমি এটি চেষ্টা করে দেখেছি "নেগেটিভ ইনডেক্সিং সমর্থিত নয়"।
বিপারপার্কার

@ ডার্কসিগনাস Product.objects.filter(~Q(price=0))[-5:]আমার জন্য একই ত্রুটি ঘটায় : "নেতিবাচক সূচী সমর্থিত নয়।"
বেরসাম

এটি ক্যোয়ারসেটে জ্যাঙ্গোতে কাজ করে না: কোড. djangoproject.com/ticket/13089 আপনি যদি ক্যোয়ারেটটিকে একটি তালিকায় রূপান্তর করেন তবে এটি কাজ করবে।
ভ্যালাম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.