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)
Единственная проблема с этим подходом заключается в том, что если ваш запрос слишком велик, использование вашей памяти будет одинаковым.
В любом случае, я не уверен в некоторых особенностях проблемы.