Django Запрос только одного поля модели с использованием.extra() и без использования.defer() или.only()

Я использую метод точного () django ORM для запроса только выбранных полей из набора моделей для экономии оперативной памяти. Я не могу использовать defer () или only () из-за некоторых ограничений на используемый мной ORM-менеджер (он не используется по умолчанию).

Следующий код работает без ошибок:

 q1 = Model.custom_manager.all().extra(select={'field1':'field1'})
 # I only want one field from this model

Однако, когда я jsonify набор запросов q1, я получаю каждое поле модели.. так что extra() не должно работать, или я делаю что-то не так?

print SafeString(serializers.serialize('json', q1))
>>> '{ everything!!!!!}'

Чтобы быть более конкретным, я использую пользовательский менеджер django-sphinx. Model.search.query(...) например.

Благодарю.

1 ответ

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

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

q1 = Model.custom_manager.values('field1', 'field2').all()

Это должно вернуть ValuesQuerySet. Который вы не сможете использовать с serializers.serialize так что вам придется сделать что-то вроде этого:

from django.utils import simplejson
data = [value for value in q1]
json_dump = simplejson.dumps(data)

Другое, вероятно, лучшее решение - просто выполнить свой запрос, как первоначально предполагалось, забыв extra а также values и просто использовать fields Kwarg в serialize метод как это:

print SafeString(serializers.serialize('json', q1, fields=('field1', 'field2')))

Недостатком является то, что ни одна из этих вещей на самом деле не делает то же самое, что Defer или Only(все поля возвращаются из базы данных), но вы получаете желаемый результат.

Другие вопросы по тегам