টেবিল ক্ষেত্র থেকে স্বতন্ত্র মান নির্বাচন করুন


104

আমি জ্যাঙ্গোর ওআরএমের চারপাশে মাথা পেতে লড়াই করছি। আমি যা করতে চাই তা হ'ল আমার টেবিলের একটি ক্ষেত্রের মধ্যে স্বতন্ত্র মানগুলির একটি তালিকা .... নীচের একটির সমতুল্য:

SELECT DISTINCT myfieldname FROM mytable

(বা বিকল্পভাবে)

SELECT myfieldname FROM mytable GROUP BY myfieldname

আমি কমপক্ষে কাঁচা এসকেএল অবলম্বন করার আগে এটি জ্যাঙ্গো পথে করতে চাই। উদাহরণস্বরূপ, একটি টেবিল সহ:

আইডি, রাস্তা, শহর

1, মেইন স্ট্রিট, হাল

2, অন্যান্য রাস্তা, হাল

3, বিবল ওয়ে, লিসেস্টার

4, অন্য উপায়, লিসেস্টার

5, হাই স্ট্রিট, লন্ডিডিয়াম

আমি পেতে চাই:

হাল, লিসেস্টার, লন্ডিডিয়াম

উত্তর:


202

বলুন আপনার মডেলটি 'শপ'

class Shop(models.Model):
    street = models.CharField(max_length=150)
    city = models.CharField(max_length=150)

    # some of your models may have explicit ordering
    class Meta:
        ordering = ('city')

যেহেতু আপনার Metaক্লাস থাকতে পারেordering অ্যাট্রিবিউট সেট , আপনি ব্যবহার order_by()করার সময় কোনও ক্রম সাফ করতে পরামিতি ছাড়াই ব্যবহার করতে পারেন distinct()() এর অধীনে ডকুমেন্টেশন দেখুনorder_by

যদি আপনি না চান যে কোনও ক্রম কোনও ডিফল্ট ক্রম নয়, কোনও কোয়েরিতে প্রয়োগ করা হোক, কোনও পরামিতি ছাড়াই অর্ডার_বি () কল করুন।

এবং distinct()নোটটিতে যেখানে এটি distinct()অর্ডার সহ ব্যবহারের বিষয়ে আলোচনা করে ।

আপনার ডিবিকে জিজ্ঞাসা করতে, আপনাকে কেবল কল করতে হবে:

models.Shop.objects.order_by().values('city').distinct()

এটি একটি কল্পিত প্রত্যাবর্তন

অথবা

models.Shop.objects.order_by().values_list('city').distinct()

এটি একটিতে ফিরে আসে ValuesListQuerySetযা আপনি কতে দিতে পারেন list। আপনি যোগ করতে পারেনflat=Truevalues_list ফলাফল সমতল করতে পারেন।

আরও দেখুন: ক্ষেত্র অনুসারে ক্যোরিসেটের স্বতন্ত্র মান পান


29
আসলে যে কাজ করে। যাহোক! আমি আমার সমস্ত মডেলটিতে এটি কাজ করতে পারি না। অদ্ভুতভাবে, এটি কিছুতে কাজ করেছে তবে অন্যদের নয়। যাঁদের একটি মেটা অর্ডার রয়েছে এটি কার্যকর হয় না। সুতরাং, আপনাকে প্রথমে ক্যোয়ারসেটে অর্ডারটি সাফ করতে হবে। মডেলস.শপ.অবজেক্টস.অর্ডার_বি ()। মান ('শহর')। স্বতন্ত্র ()
আলজ

2
এটি লক্ষ করা গুরুত্বপূর্ণ যে values_listআসলে কোনও তালিকা ফেরত দেয় না। এটি ক্যোরিসেটের মতো কিছু দেয়। আমি সবসময় মান_ তালিকা কলের চারপাশে তালিকা () ব্যবহার করা দরকারী বলে মনে করি।
ধীরোসর

8
values_listমানাদির তালিকাগুলি সেট দেয় যা একটি পুনরাবৃত্তিকারী। তালিকায় কাস্ট করা কার্যকর হতে পারে, তবে যখন সমস্ত সারিগুলি একবারে মূল্যায়ন করতে হয়, বিশেষত বড় ডেটা সেট সহ, তখন পারফরম্যান্সকে আঘাত করতে পারে।
পিটার কিলকুকুক

3
Meta: ordering = ()জ্যাঙ্গো ORM এবং "বৈশিষ্ট্যটি" objects.distinct()বনাম objects.ordering().distinct()আমাদের বিভ্রান্তির ঘণ্টা হত। সেই পণ্যটিতে একটি ভোক্তা-সুরক্ষা সতর্কতা স্টিকার থাকা উচিত;) ভবিষ্যতে মাথা আঁচড়ানো রোধ করতে আমরা একটি নো-মেটা-অর্ডারিং-অ্যাট্রিবিউট নীতি চালু করতে পারি।
hobs

আপনি Metaক্লাস বন্ধ করতে পারেন orderingএবং কোনও পরামিতি distinctব্যবহার order_by()না করে সমস্যাগুলি সমাধান করতে পারেন । এটি কোয়েরীসেট এপিআই ডক্সের অধীনে order_by()" যদি আপনি কোনও ক্যোয়ারিতে কোনও অর্ডারিং প্রয়োগ করতে চান না, এমনকি ডিফল্ট ক্রম নয়, order_by()কোনও প্যারামিটার ছাড়াই কল করুন । "
মার্ক মিকোফস্কি

11

এখনও খুব প্রাসঙ্গিক ছাড়াও jujule উত্তর , আমি এটা বেশ গুরুত্বপূর্ণ এছাড়াও প্রভাব সচেতন হতে হবে এটি order_by()উপর distinct("field_name")প্রশ্নের।এটি অবশ্য পোস্টগ্রিসের বৈশিষ্ট্য মাত্র!

আপনি যদি পোস্টগ্রিস ব্যবহার করছেন এবং যদি আপনি কোনও ক্ষেত্রের নামটি নির্ধারণ করেন যা কোয়েরিটির জন্য স্বতন্ত্র হওয়া উচিত তবে order_by()একই ক্ষেত্রের একই নাম (বা ক্ষেত্রের নাম) একই ক্রমের সাথে শুরু করা উচিত (পরে আরও ক্ষেত্র থাকতে পারে)।

বিঃদ্রঃ

আপনি যখন ক্ষেত্রের নাম নির্দিষ্ট করেন, আপনাকে অবশ্যই ক্যোরিসেটে একটি অর্ডার_বি () প্রদান করতে হবে, এবং ক্রম_আর () দ্বারা ক্ষেত্রগুলি অবশ্যই একই ক্রমে পৃথক () দিয়ে শুরু করতে হবে।

উদাহরণস্বরূপ, নির্বাচন করুন নির্বাচন করুন (ক) কলামে প্রতিটি মানের জন্য আপনাকে প্রথম সারি দেয়। আপনি যদি কোনও অর্ডার নির্দিষ্ট না করেন তবে আপনি কিছু স্বেচ্ছাসেবী সারি পাবেন।

আপনি উদাহরণস্বরূপ- যে শহরগুলিতে আপনি দোকানগুলি জানেন সেগুলির একটি তালিকা বের করতে চাইলে জুজুলের উদাহরণটি এর সাথে মানিয়ে নিতে হবে:

# returns an iterable Queryset of cities.
models.Shop.objects.order_by('city').values_list('city', flat=True).distinct('city')  

2

উদাহরণস্বরূপ:

# select distinct code from Platform where id in ( select platform__id from Build where product=p)
pl_ids = Build.objects.values('platform__id').filter(product=p)
platforms = Platform.objects.values_list('code', flat=True).filter(id__in=pl_ids).distinct('code')
platforms = list(platforms) if platforms else []
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.