Django: эквивалент "select [имя столбца] из [tablename]"

Я хотел знать, есть ли что-то эквивалентное:

select columnname from tablename

Как говорится в учебнике Django:

Entry.objects.filter(condition)

извлекает все объекты с заданным условием. Это как:

select * from Entry where condition

Но я хочу составить список только одного столбца [который в моем случае является внешним ключом]. Найдено, что:

Entry.objects.values_list('column_name', flat=True).filter(condition)

делает то же самое. Но в моем случае столбец является внешним ключом, и этот запрос теряет свойство внешнего ключа. Он просто сохраняет значения. Я не могу выполнить поисковые запросы.

Ответ 1

Конечно, values и value_list будут извлекать необработанные значения из базы данных. Django не может использовать свою "магию" на модели, что означает, что вы не получаете возможности обходить отношения, потому что вы застряли с идентификатором, к которому указывает внешний ключ, а не поле ForeignKey.

Если вам нужно отфильтровать эти значения, вы можете сделать следующее (предполагается, что column_name - это ForeignKey, указывающий на MyModel):

ids = Entry.objects.values_list('column_name', flat=True).filter(...)
my_models = MyModel.objects.filter(pk__in=set(ids))

Здесь приведена документация для values_list()

Ответ 2

У вас есть модель A с внешним ключом для другой модели B, и вы хотите выбрать B, на которые ссылаются некоторые A. Это правильно? Если это так, запрос, который вы хотите, просто:

B.objects.filter(a__isnull = False)

Если у вас есть условия для соответствующего A, тогда запрос может быть:

B.objects.filter(a__field1 = value1, a__field2 = value2, ...)

См. Django обратную документацию для объяснения, почему это работает, и ForeignKey.related_name, если вы хотите изменить имя обратного отношения.

Ответ 3

Чтобы ограничить набор запросов конкретным столбцом (-ами), вы используете .values ​​(columname)

Вероятно, вы также можете добавить отличный от конца, поэтому ваш запрос будет заканчиваться следующим:

Entry.objects.filter(myfilter).values(columname).distinct()

Смотрите: https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.values

для получения дополнительной информации

В зависимости от вашего ответа в комментарии, я вернусь и отредактирую.

Edit:

Я не уверен, что подход правильный. Вы можете получить все свои объекты в списке python, получив обычный запрос через фильтр, а затем выполните:

myobjectlist = map(lambda x: x.mycolumnname, myqueryset)

Единственная проблема с этим подходом заключается в том, что если ваш запрос слишком велик, использование вашей памяти будет одинаковым.

В любом случае, я не уверен в некоторых особенностях проблемы.