Django - вызов атрибута из набора запросов со строкой - PullRequest
0 голосов
/ 13 мая 2018

Я пытаюсь перебрать разные наборы запросов, не повторяя при этом слишком много, и столкнулся с проблемой при использовании класса queryset. Это не обязательно проблема Джанго.

То, что я пытаюсь сделать, - это использовать мой список ключей, который соответствует именам столбцов модели django, для создания списка данных из этих имен столбцов, что я хочу сделать, это что-то вроде этого:

if needthisdata==1:
    needdata=['column1', 'column2', 'column3']
else:
    needdata=['column1', 'column4', 'column7']
entry=djangomodel.get.all().filter(identifier='id')
dictitems=[]
for n in range(0, len(needdata)):
    if n==0:
        dictitems=[entry.needdata[n]]
    else:
        dictitems.append(entry.needdata[n])

Что, конечно, не работает, так как в наборе запросов нет нужного атрибута данных, есть ли способ вызвать атрибут для класса со строкой таким образом?

1 Ответ

0 голосов
/ 13 мая 2018

Действительный оператор Django для получения единственной записи

Прежде всего, здесь есть некоторые семантические проблемы:

  • itentifier, вероятно, должно бытьidentifier, id или pk;
  • вы используете .all немедленно, вместо того, чтобы сначала получить менеджера (вероятно, .objects);и
  • здесь вы используете .filter(..) в наборе запросов для фильтрации по идентификатору, но обычно это должно быть .get(..), так как при использовании фильтра ноль, один или несколько результатов могут быть возвращены витерируемый.
entry = djangomodel.objects<b>.get(id=some_id)</b>

Итак, теперь мы получаем одну запись, но это, конечно, не разрешает получение столбцов.

Если все элементы real столбцы Django

В случае, если столбцы являются настоящими полями Django (поэтому нет @property s и т. Д.), Тогда мы можем использовать values_list и выполнить конструктор list(..) для него:

dictitems = <b>list(</b>djangomodel.objects<b>.values_list(*needdata)</b>.get(id=some_id)<b>)</b>

Если некоторые элементы @property s

В случае не все эти поля являются реальными полями Django, тогда мы можем использовать attrgetter вместо:

<b>from operator import attrgetter</b>

dictitems = <b>list(attrgetter(*needdata)(</b>djangomodel.objects.get(id=some_id)<b>))</b>
...