#python #python-3.x #django #list #django-views
#python #python-3.x #django #Список #django-представления
Вопрос:
структура таблицы:
-------------------------------------
| id | keywords |
=====================================
| 1 | animals,orange ball |
|-----------|-------------------------|
| 2 |animals,pet, dog,as usual|
|-----------|-------------------------|
| 3 |'anime, animations,superhero,cartoon'|
|_____________________________________|
views.py
TagList = ImgDetails.objects.values_list('keywords').order_by('keywords')
Я получаю значение из базы данных в наборе запросов:
вывод:
<QuerySet [('animals,orange ball',), ('animals,pet, dog,as usual',), ('animals',), ('animals',), ('animals, pet,dog',), ('animals, pet,dog',), ('animals, pet,dog',), ('animals,fore
st,tiger,lion',), ('animals,forest,tiger,lion',), ('animation,sasuke,cartoon,anime',), ('anime, animations,superhero,cartoon',), ('anime, animations,superhero,cartoo
n',), ('anime, animations,superhero,cartoon',), ('anime, animations,superhero,cartoon',), ('cat,deer',), ('cat,deer',), ('nature, forest, greenry',), ('nature, fores
t, greenry',), ('nature, forest, greenry',)]>
Я хочу извлечь все уникальные значения или, можно сказать, строку из набора запросов в списке, подобном этому:
['animals','orange ball','anime','animations','superhero','cartoon','dog','tiger','forest','animation']
Я могу использовать вложенный цикл for, чтобы сделать это. Но есть ли какой-нибудь простой способ получить строку из набора запросов в списке.
Ответ №1:
Я не знаю, правильный ли это способ сделать это или нет, но я его использую:
def getTags():
TagList = ImgDetails.objects.values_list('keywords', flat=True).order_by('keywords')
tagsuggestions = set([item for sublist in TagList for item in str(sublist).split(',')])
return tagsuggestions
Ответ №2:
Вы должны получить список кортежей следующим запросом:
image_details = ImgDetails.objects.annotate(keyword_list=Func(F('keywords'),Value(','),function='string_to_array'))
теперь вы можете получить список полей keywords
в keyword_list
.
Комментарии:
1. я не думаю, что смогу использовать
distinct()
onimgdetails
object, как если бы вы видели. столбец ключевых слов используетсяanimals,orange ball
как одна строка одного поля иanimals,pet, dog,as usual
как другая строка 2-го поля. который всегда будет отличным.2. наилучшей практикой в этом случае является использование
array_field
или normalize database. но вы можете использоватьstring_to_array
функцию в postgres (если вы используете postgres).image_details = ImgDetails.objects.annotate(keyword_list=Func(F('keywords'),Value(','),function='string_to_array'))