জ্যাঙ্গোতে, কেউ কীভাবে গতিশীল ক্ষেত্রের অনুসন্ধানগুলির সাথে একটি ক্যুরিসেট ফিল্টার করে?


160

একটি শ্রেণি দেওয়া:

from django.db import models

class Person(models.Model):
    name = models.CharField(max_length=20)

এটি কি সম্ভব, এবং যদি হয় তবে কীভাবে, গতিশীল আর্গুমেন্টের উপর ভিত্তি করে ফিল্টারকারী একটি ক্যুরিসেট থাকবে? উদাহরণ স্বরূপ:

 # Instead of:
 Person.objects.filter(name__startswith='B')
 # ... and:
 Person.objects.filter(name__endswith='B')

 # ... is there some way, given:
 filter_by = '{0}__{1}'.format('name', 'startswith')
 filter_value = 'B'

 # ... that you can run the equivalent of this?
 Person.objects.filter(filter_by=filter_value)
 # ... which will throw an exception, since `filter_by` is not
 # an attribute of `Person`.

উত্তর:


310

পাইথনের যুক্তি প্রসারণ এই সমস্যাটি সমাধান করতে ব্যবহৃত হতে পারে:

kwargs = {
    '{0}__{1}'.format('name', 'startswith'): 'A',
    '{0}__{1}'.format('name', 'endswith'): 'Z'
}

Person.objects.filter(**kwargs)

এটি একটি খুব সাধারণ এবং দরকারী পাইথন আইডিয়াম।


6
কেবলমাত্র একটি দ্রুত গ্যাচা শিরোনাম: নিশ্চিত করুন যে কাওয়ার্গের স্ট্রিংগুলি টাইপ স্ট্রাইক ইউনিকোড নয়, অন্যথায় ফিল্টার () গ্রাং হবে।
স্টিভ জলিম

1
@santiagobasulto এটিকে প্যাকেট প্যাকিং / আনপ্যাকিং এবং এর বিভিন্নতা উল্লেখ করা হয়।
ড্যানিয়েল নাব

7
সুন্দর, সুন্দর, এবং সুন্দর !
অস্কার মেডেরোস

5
@ ড্যানিয়েলনাব তবে এটি ওওয়ার শর্তের জন্য যে কোনও বিকল্প, শর্ত ফিল্টারিংয়ের উপর কাজ করা কাওয়ারগুলি নিয়ে কাজ করবে।
Prateek099

3
প্রশ্নঃ @prateek আপনি সবসময় ব্যবহার করতে পারেন বস্তু: stackoverflow.com/questions/13076822/...
deecodameeko

6

সরলীকৃত উদাহরণ:

জাজানো জরিপ অ্যাপ্লিকেশনটিতে, আমি নিবন্ধিত ব্যবহারকারীদের দেখানোর জন্য একটি এইচটিএমএল নির্বাচন তালিকা চেয়েছিলাম। তবে আমাদের 5000 নিবন্ধিত ব্যবহারকারী রয়েছে, সুতরাং আমার কাছে ক্যোয়ারী মানদণ্ডের উপর ভিত্তি করে সেই তালিকাটি ফিল্টার করার একটি উপায়ের প্রয়োজন ছিল (যেমন কেবলমাত্র একটি নির্দিষ্ট কর্মশালা সম্পন্ন ব্যক্তিরা)। জরিপের উপাদানটি পুনঃব্যবহারযোগ্য হওয়ার জন্য, আমার জরিপ প্রশ্ন তৈরির ব্যক্তির পক্ষে সেই প্রশ্নের সাথে এই মানদণ্ডগুলি সংযুক্ত করতে সক্ষম হওয়া প্রয়োজন (অ্যাপটিতে কোয়েরিটিকে হার্ড-কোড করতে চান না)।

আমি যে সমাধানটি নিয়ে এসেছি তা 100% ব্যবহারকারী বান্ধব নয় (ক্যোয়ারী তৈরি করতে কোনও প্রযুক্তি ব্যক্তির সাহায্য প্রয়োজন) তবে এটি সমস্যার সমাধান করে না। প্রশ্ন তৈরি করার সময় সম্পাদক কাস্টম ক্ষেত্রে একটি অভিধান প্রবেশ করতে পারে, যেমন:

{'is_staff':True,'last_name__startswith':'A',}

সেই স্ট্রিংটি ডাটাবেসে জমা থাকে। ভিউ কোডে, এটি আবার ফিরে আসে self.question.custom_query। এর মান একটি স্ট্রিং যা অভিধানের মতো দেখায় । আমরা এটিকে eval () দিয়ে আবার একটি বাস্তব অভিধানে পরিণত করি এবং তারপরে এটি ** কাওয়ার্গেসের সাথে ক্যোয়ারসেটে স্টাফ করি:

kwargs = eval(self.question.custom_query)
user_list = User.objects.filter(**kwargs).order_by("last_name")   

আমি ভাবছি এমন একটি কাস্টম মডেলফিল্ড / ফর্মফিল্ড / উইজেটফিল্ড তৈরি করতে কী গ্রহণ করবে যা জিইউআই পক্ষের ব্যবহারকারীকে মূলত একটি প্রশ্ন "বিল্ড" করতে দেয়, প্রকৃত পাঠ্যটি কখনও দেখেনি, তবে একটি ইন্টারফেস ব্যবহার করে তাই করো. একটি ঝরঝরে প্রকল্পের মতো শোনাচ্ছে ...
টি স্টোন

1
টি। স্টোন - আমি কল্পনা করেছিলাম যে যদি এমন মডেলগুলির অনুসন্ধানের প্রয়োজন হয় তবে সরল পদ্ধতিতে এ জাতীয় সরঞ্জাম তৈরি করা সহজ ছিল তবে সমস্ত সম্ভাব্য বিকল্পগুলি প্রকাশ করে এমন একটি বিশদ পদ্ধতিতে করা খুব কঠিন, বিশেষত যদি মডেলগুলি ছিল জটিল।
শ্যাকার

5
eval()ব্যবহারকারীদের আমদানিতে কল করা একটি খারাপ ধারণা, এমনকি যদি আপনি আপনার ব্যবহারকারীদের পুরোপুরি বিশ্বাস করেন। একটি JSON ক্ষেত্র এখানে আরও ভাল ধারণা হবে।
জন কার্টার

5

Django.db.models.Q ঠিক কি আপনি একটি জ্যাঙ্গো ভাবে চাই।


7
আপনি কী (বা কেউ) কীভাবে গতিশীল ক্ষেত্রের নাম ব্যবহার করে কিউ অবজেক্ট ব্যবহার করবেন তার একটি উদাহরণ সরবরাহ করতে পারেন?
jackdbernier

3
ড্যানিয়েল নবাবের উত্তরের মতই এটি হ'ল পার্থক্য হ'ল আপনি কি আর্গুমেন্ট কনস্ট্রাক্টরের মধ্যে যুক্তিগুলি পাস করেন pass Q(**filters), যদি আপনি কিউ অবজেক্টগুলি গতিশীলভাবে গড়ে তুলতে চান তবে আপনি সেগুলিকে একটি তালিকায় রাখতে পারেন এবং ব্যবহার করতে পারেন .filter(*q_objects)বা কিউ অবজেক্টগুলিকে একত্রিত করতে বিটওয়াইস অপারেটরগুলি ব্যবহার করতে পারেন।
এস

5
এই উত্তরে ওপির সমস্যা সমাধানের জন্য কিউ ব্যবহারের উদাহরণ অন্তর্ভুক্ত করা উচিত।
pdoherty926

-2

একটি সত্যই জটিল অনুসন্ধান ফর্মগুলি সাধারণত ইঙ্গিত দেয় যে একটি সহজ মডেল এটি খনন করার চেষ্টা করছে।

কীভাবে, ঠিক কীভাবে আপনি কলামের নাম এবং ক্রিয়াকলাপের মান পাবেন? আপনি কোথায় 'name'একটি এর মান পেতে 'startswith'?

 filter_by = '%s__%s' % ('name', 'startswith')
  1. একটি "অনুসন্ধান" ফর্ম? আপনি যাচ্ছেন - কি? - নামের তালিকা থেকে নাম বাছবেন? অপারেশনগুলির একটি তালিকা থেকে অপারেশনটি বেছে নেবেন? ওপেন-এন্ডে থাকাকালীন, বেশিরভাগ লোকেরা এই বিভ্রান্তিকর এবং কঠোর ব্যবহারের মতো খুঁজে পান।

    কয়টি কলামে এই ধরনের ফিল্টার রয়েছে? 6? 12? 18?

    • কয়েকটা? একটি জটিল পিক-তালিকাটি বোঝায় না। কয়েকটি ক্ষেত্র এবং কয়েকটি যদি বিবৃতিগুলি বোঝায়।
    • একটি বিশাল সংখ্যা? আপনার মডেলটি ঠিক শোনাচ্ছে না। দেখে মনে হচ্ছে "ক্ষেত্র" আসলে অন্য কোনও টেবিলের একটি সারির চাবি, কোনও কলাম নয়।
  2. নির্দিষ্ট ফিল্টার বোতাম। অপেক্ষা করুন ... জ্যাঙ্গো অ্যাডমিন এভাবে কাজ করেন। নির্দিষ্ট ফিল্টারগুলি বোতামে রূপান্তরিত হয়। এবং উপরের মতো একই বিশ্লেষণ প্রযোজ্য। কয়েকটি ফিল্টার অর্থবোধ করে। প্রচুর ফিল্টার বলতে সাধারণত এক ধরণের প্রথম সাধারণ ফর্ম লঙ্ঘন করে।

অনেকগুলি অনুরূপ ক্ষেত্রের অর্থ প্রায়ই বেশি সারি এবং কম ক্ষেত্র হওয়া উচিত ছিল।


9
শ্রদ্ধার সাথে, নকশা সম্পর্কে কিছু না জেনে সুপারিশ করা সমীচীন। এই অ্যাপ্লিকেশনটির "সহজভাবে প্রয়োগ" করার জন্য প্রয়োজনীয়তাগুলি পূরণ করতে জ্যোতির্বিজ্ঞানের (> 200 অ্যাপ্লিকেশন ^ 21 ফু) ফাংশন পাওয়া যাবে। আপনি উদাহরণের উদ্দেশ্য এবং উদ্দেশ্য পড়ছেন; আপনার উচিত হবে না। :)
ব্রায়ান এম হান্ট

2
আমি প্রচুর লোকের সাথে দেখা করি যারা মনে করেন যে তাদের সমস্যা সমাধানের জন্য ক্ষুদ্রতর হবে যদি কেবল জিনিসগুলি (ক) আরও জেনেরিক হত এবং (খ) তারা কল্পনা করে কাজ করেছিল। এই পথটি অন্তহীন হতাশায় পড়ে আছে কারণ জিনিসগুলি তাদের কল্পনা করার উপায় নয়। "ফ্রেমওয়ার্ক ঠিক করা" থেকে অনেক ব্যর্থতা আমি দেখেছি।
এস .লট

2
ড্যানিয়েলের প্রতিক্রিয়া অনুসারে জিনিসগুলি প্রত্যাশিত ও কাঙ্ক্ষিত হিসাবে কাজ করে। আমার প্রশ্নটি সিনট্যাক্স সম্পর্কে ছিল, ডিজাইনের নয়। আমার যদি নকশাটি লেখার সময় ছিল, আমি এটি করে ফেলতাম। আমি নিশ্চিত যে আপনার ইনপুট সহায়ক হবে, তবে এটি কেবল ব্যবহারিক বিকল্প নয়।
ব্রায়ান এম হান্ট

8
এস। লট, আপনার উত্তর এমনকি দূরবর্তী অবস্থান থেকে এই প্রশ্নের উত্তর দেয় না। আপনি যদি উত্তরটি না জানেন তবে দয়া করে প্রশ্নটি ছেড়ে দিন। আপনার যখন ডিজাইনের সম্পূর্ণ শূন্য জ্ঞান থাকবে তখন অবৈধ নকশার পরামর্শ দিয়ে সাড়া দেবেন না!
স্লিপেট

2
স্লিপাইট: ডিজাইনের কোনও পরিবর্তন যদি সমস্যাটি সরিয়ে দেয় তবে সমস্যাটি সমাধান হয়ে যায়। দুর্বল ডিজাইনের ভিত্তিতে পথে চালিয়ে যাওয়া প্রয়োজনের চেয়ে ব্যয়বহুল এবং জটিল। খারাপ কারণগুলির সিদ্ধান্তগুলি থেকে উদ্ভূত অন্যান্য সমস্যাগুলি সমাধান করার চেয়ে মূল কারণ সমস্যার সমাধান করা ভাল। আমি দুঃখিত আপনি মূল কারণ বিশ্লেষণ পছন্দ করেন না। তবে যখন কোনও জিনিস সত্যিই কঠিন হয় তখন এর অর্থ সাধারণত আপনি ভুল জিনিসটি শুরু করার চেষ্টা করছেন।
এস .লট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.