как получить значения из вложенного набора запросов list в python?

#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() on imgdetails 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'))