Рендеринг группы по запросам на интерфейсе администратора django. (различные значения в поле нарушены в Django) - PullRequest
0 голосов
/ 05 февраля 2012

Существует таблица datagen_crawlmeta с id в качестве первичного ключа. Я хочу получить отчетливый нм из таблицы и отобразить его.

mysql> SELECT id, gid_id, nm from datagen_crawlmeta limit 10;
+----+--------+----------------------------+
| id | gid_id | nm                         |
+----+--------+----------------------------+
|  1 |      1 | votes                      |
|  2 |      1 | performance_rating         |
|  3 |      1 | title                      |
|  4 |      1 | specs__Sound__Loudspeaker  |
|  5 |      1 | specs__Sound__3.5mm jack   |
|  6 |      1 | specs__Sound__Alert types  |
|  7 |      1 | specs__Sound__unknown0     |
|  8 |      1 | specs__Features__Java      |
|  9 |      1 | specs__Features__Messaging |
| 10 |      1 | specs__Features__Colors    |
+----+--------+----------------------------+
10 rows in set (0.00 sec)

Использование следующего кода возвращает все строки. Это потому, что self.model.objects.all().distinct('nm') возвращает объект CrawlMeta, а не отдельный нм.

Я мог бы использовать self.model.objects.values_list('nm', flat=True).distinct(), но это возвращает список nm, который несовместим с возвращаемым типом набора запросов.

class CrawlMetaAdmin(admin.ModelAdmin):
    list_display = ['nm']

    def queryset(self, request):
        query_dict = request.GET
        nm = query_dict.get('nm')
        return self.model.objects.all().distinct('nm')

Моя последняя цель - показать нм и счетчик в интерфейсе администратора django, используя следующий запрос.

select nm, count(*) from datagen_crawlmeta group by nm;

1 Ответ

1 голос
/ 06 февраля 2012

Во-первых, вместо использования

self.model.objects.values_list('nm', flat=True).distinct() и self.model.objects.all().distinct('nm')

используйте

self.model.objects.values('nm').distinct().

Во-вторых, чтобы написать эквивалент djangoиз

select nm, count(*) from datagen_crawlmeta group by nm;

use

self.model.objects.values('nm').annotate(count_nm=Count('nm')).values('nm','count_nm').

Теперь, используя их, вы можете манипулировать функцией queryset и получать две вещи, отображаемые вваш админ.

...