حدد قيمًا مميزة من حقل جدول
-
20-09-2019 - |
سؤال
أنا أعاني من الحصول على رأسي حول 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 []