Walczę z poruszaniem się po ORM Django. Chcę uzyskać listę różnych wartości w polu w mojej tabeli ... odpowiednik jednego z poniższych:
SELECT DISTINCT myfieldname FROM mytable
(lub alternatywnie)
SELECT myfieldname FROM mytable GROUP BY myfieldname
Chciałbym przynajmniej zrobić to w sposób Django, zanim skorzystam z surowego sql. Na przykład ze stołem:
id, ulica, miasto
1, Main Street, Hull
2, Inna ulica, Hull
3, Bibble Way, Leicester
4, Inny sposób, Leicester
5, High Street, Londidium
Chciałbym dostać:
Hull, Leicester, Londidium.
values_list
rzeczywistości nie zwraca to listy. Zwraca coś w rodzaju zestawu zapytań. Uważam, że przydatne jest zawsze używanie list () wokół wywołań wartości_list.values_list
zwraca ValuesListQuerySet, który jest iteratorem. Przesyłanie na listę może być przydatne, ale może również wpłynąć na wydajność, gdy wszystkie wiersze muszą zostać ocenione jednocześnie, szczególnie w przypadku dużych zestawów danych.Meta: ordering = ()
„Cecha” Django ORM orazobjects.distinct()
vs.objects.ordering().distinct()
spowodowane nam godziny zamieszania. Na tym produkcie powinna znajdować się naklejka ostrzegawcza dotycząca bezpieczeństwa konsumenta;) Możemy wprowadzić politykę braku atrybutu meta-zamawiania, aby zapobiec zarysowaniu głowy w przyszłości.Meta
klasęordering
i rozwiązać problemy zdistinct
użyciemorder_by()
bez parametrów. Znajduje się w dokumentacji QuerySet API w sekcjiorder_by()
„ Jeśli nie chcesz, aby do zapytania zastosowano kolejność, nawet domyślną, wywołajorder_by()
bez parametrów. ”Poza tym nadal bardzo istotnych odpowiedzi na jujule uważam, że to bardzo ważne, aby być także świadomi konsekwencji
order_by()
nadistinct("field_name")
zapytaniami. Jest to jednak tylko funkcja Postgres!Jeśli używasz Postgres i jeśli zdefiniujesz nazwę pola, dla którego zapytanie powinno być odrębne, to
order_by()
musi zaczynać się tą samą nazwą pola (lub nazwami pól) w tej samej kolejności (później może być więcej pól).Jeśli chcesz np - wyodrębnić listę miast, w których znasz sklepy, przykład jujule musiałby zostać dostosowany do tego:
źródło
Przez przykład:
źródło