জ্যাঙ্গোতে DISTINCT স্বতন্ত্র কলামগুলি নির্বাচন করবেন?


97

জ্যাঙ্গোতে কোয়েরি করার কোনও উপায় নেই যা SELECT * FROM...নীচে নয় "আমি আগ্রহী । আমি SELECT DISTINCT columnName FROM ...পরিবর্তে একটি " " করার চেষ্টা করছি ।

বিশেষত আমার কাছে এমন একটি মডেল রয়েছে যা দেখতে:

class ProductOrder(models.Model):
   Product  = models.CharField(max_length=20, promary_key=True)
   Category = models.CharField(max_length=30)
   Rank = models.IntegerField()

যেখানে Ranka এর মধ্যে একটি স্থান রয়েছে Category। আমি এই বিভাগের মধ্যে প্রতিটি পদে কিছু ক্রিয়াকলাপ করে সমস্ত বিভাগগুলিতে পুনরাবৃত্তি করতে সক্ষম হতে চাই।

আমি প্রথমে সিস্টেমের সমস্ত বিভাগের একটি তালিকা পেতে চাই এবং তারপরে সেই বিভাগের সমস্ত পণ্যের জন্য জিজ্ঞাসা করতে এবং প্রতিটি বিভাগটি প্রক্রিয়া না করা পর্যন্ত পুনরাবৃত্তি করতে চাই।

আমি বরং কাঁচা এসকিউএল এড়াতে চাই, তবে যদি আমাকে সেখানে যেতে হয়, তবে তা ঠিক আছে। যদিও আমি এর আগে জ্যাঙ্গো / পাইথনে কাঁচা এসকিউএল কোড করি নি।

উত্তর:


196

ডাটাবেস থেকে স্বতন্ত্র কলামের নামের তালিকা পাওয়ার একটি উপায় distinct() এর সাথে মিলিয়ে ব্যবহার করা values()

আপনার ক্ষেত্রে স্বতন্ত্র বিভাগগুলির নাম পেতে নিম্নলিখিতগুলি করতে পারেন:

q = ProductOrder.objects.values('Category').distinct()
print q.query # See for yourself.

# The query would look something like
# SELECT DISTINCT "app_productorder"."category" FROM "app_productorder"

এখানে কয়েকটি জিনিস মনে রাখতে হবে। প্রথমত, এটি ValuesQuerySetএমন একটিকে ফিরে আসবে যা এ থেকে আলাদা আচরণ করে QuerySet। আপনি বলতে অ্যাক্সেস, তখন প্রথম উপাদান q(উপরে) আপনি একটি পাবেন অভিধান , না একটি দৃষ্টান্ত ProductOrder

দ্বিতীয়ত, ব্যবহার সম্পর্কে ডক্সে সতর্কতা নোটটি পড়া ভাল ধারণা হবে distinct()। উপরের উদাহরণটি কাজ করবে তবে সমস্ত সংমিশ্রণ distinct()এবং values()নাও পারে।

পিএস : কোনও মডেলের ক্ষেত্রে ক্ষেত্রের জন্য ছোট ছোট নাম ব্যবহার করা ভাল ধারণা । আপনার ক্ষেত্রে এর অর্থ হ'ল নীচের চিত্র অনুসারে আপনার মডেলটি পুনরায় লেখা:

class ProductOrder(models.Model):
    product  = models.CharField(max_length=20, primary_key=True)
    category = models.CharField(max_length=30)
    rank = models.IntegerField()

4
নীচে বর্ণিত পদ্ধতিটি এখন জাজানো ১.৪ এ উপলব্ধ এবং আপনার যদি ক্ষেত্র সচেতন স্বতন্ত্র ;-) সহ প্রোডাক্ট অর্ডার উদাহরণ প্রয়োজন হয়
জোনাথন লিউটি

66

এটি বেশ সহজ যদি আপনি পোস্টগ্রিজ এসকিউএল ব্যবহার করেন তবে কেবল distinct(columns)( ডকুমেন্টেশন ) ব্যবহার করুন ।

Productorder.objects.all().distinct('category')

নোট করুন যে এই বৈশিষ্ট্যটি জঙ্গোতে 1.4 সাল থেকে অন্তর্ভুক্ত করা হয়েছে


@ ল্যাজারসায়েন্স, @ মনোজ গোবিন্দন: আমি দুঃখিত, আপনি ঠিক বলেছেন। দেখে মনে হচ্ছে যে বৈশিষ্ট্যটি যুক্ত করতে আমি জ্যাঙ্গোকে প্যাচ করেছি। আমি
প্যাচটিতে

4
এটি এখন জ্যাঙ্গো এসভিএন-এ এবং জাজানো ১.৪
থাকবে

14
দ্রষ্টব্য: আপনি PostgreSQL ব্যবহার না করে আপনি আলাদা () যুক্তি দিতে পারবেন না। উপরে গৃহীত সমাধান সহ সেরা স্টিক।
মার্ক চ্যাকারিয়ান

পরীক্ষাগুলিতে, এটি can_distinct_on_fieldsকেবল
পোস্টগ্র্রেস

4
প্লাস 1, তবে all()এখানে প্রয়োজনীয় নয়
অ্যান্টনি হ্যাচকিন্স

17

অন্যান্য উত্তরগুলি ভাল, তবে এটি একটি পরিষ্কার পরিচ্ছন্ন, এটি কেবলমাত্র জ্যাঙ্গো থেকে কোনও ক্রাফট ছাড়াই একটি DISTINCT ক্যোয়ারী থেকে পাওয়া মানগুলি দেয়।

>>> set(ProductOrder.objects.values_list('category', flat=True))
{u'category1', u'category2', u'category3', u'category4'}

বা

>>> list(set(ProductOrder.objects.values_list('category', flat=True)))
[u'category1', u'category2', u'category3', u'category4']

এবং, এটি PostgreSQL ছাড়াই কাজ করে।

এটি একটি ডিস্টিস্টিন্ট () ব্যবহারের চেয়ে কম দক্ষ, মনে করে যে আপনার ডাটাবেসে DISTINCT একটি অজগরটির চেয়ে দ্রুত set, তবে শেলের চারপাশে নুডলিংয়ের জন্য এটি দুর্দান্ত।


values_listDISTINCTবর্গ কোয়েরিতে রাখে না , সুতরাং এটি যদি একাধিক মান নিয়ে আসে।
মেহমেট

13

ব্যবহারকারী সেই ক্ষেত্রটি দিয়ে অর্ডার করুন এবং তারপরে স্বতন্ত্রভাবে করুন।

ProductOrder.objects.order_by('category').values_list('category', flat=True).distinct()
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.