سؤال

أنا أعاني من الحصول على رأسي حول Orm Django. ما أريد القيام به هو الحصول على قائمة من القيم المتميزة داخل حقل على طاولتي .... ما يعادل واحدة مما يلي:

SELECT DISTINCT myfieldname FROM mytable

(أو بدلا من ذلك)

SELECT myfieldname FROM mytable GROUP BY myfieldname

أود على الأقل أن أفعل ذلك بطريقة Django قبل اللجوء إلى Raw SQL. على سبيل المثال ، مع جدول:

معرف ، شارع ، المدينة

1 ، الشارع الرئيسي ، بدن

2 ، شارع آخر ، هال

3 ، بيبل واي ، ليستر

4 ، بطريقة أخرى ، ليستر

5 ، شارع هاي ، لونديديوم

أود الحصول على:

هال ، ليستر ، لونديديوم.

هل كانت مفيدة؟

المحلول

قل أن نموذجك هو "متجر"

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()

إذا كنت لا تريد تطبيق أي طلب على استعلام ، ولا حتى الطلب الافتراضي ، اتصل على order_by () بدون معلمات.

و distinct() في الملاحظة التي تناقش فيها المشكلات المتعلقة باستخدام distinct() مع الطلب.

للاستعلام عن ديسيبل ، عليك فقط الاتصال:

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

يعيد ألعابا

أو

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

هذا واحد يعيد أ ValuesListQuerySet الذي يمكنك إلقاؤه إلى list. يمكنك أيضا إضافة flat=True ل values_list لتسوية النتائج.

أنظر أيضا: احصل على قيم متميزة من QuerySet حسب الحقل

نصائح أخرى

بالإضافة إلى ما زال ذا صلة جدا إجابة Jujule, ، أجد أنه من المهم جدًا أن أكون أيضًا على دراية بالآثار order_by() تشغيل distinct("field_name") استفسارات. هذا ، ومع ذلك ، ميزة postgres فقط!

إذا كنت تستخدم postgres وإذا قمت بتحديد اسم حقل يجب أن يكون الاستعلام متميزًا ، فهناك order_by() يجب أن تبدأ بنفس اسم الحقل (أو أسماء الحقول) في نفس التسلسل (قد يكون هناك المزيد من الحقول بعد ذلك).

ملحوظة

عندما تحدد أسماء الحقول ، يجب عليك تقديم order_by () في QuerySet ، ويجب أن تبدأ الحقول في Order_by () بالحقول في متميزة () ، بنفس الترتيب.

على سبيل المثال ، حدد متميزًا على (أ) يمنحك الصف الأول لكل قيمة في العمود أ. إذا لم تحدد طلبًا ، فستحصل على بعض الصف التعسفي.

إذا كنت ترغب في استخراج قائمة من المدن التي تعرفها المتاجر ، فيجب أن يتم تكييف مثال Jujule مع هذا:

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

على سبيل المثال:

# 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 []
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top