Django .defer() для удаления значения из queryset
def get_client_queryset(query=None):
queryset = []
queries = query.split(' ')
for q in queries:
details = clients.objects.filter(
Q(name__icontains=q) |
Q(number__icontains=q) |
Q(email__icontains=q)
).distinct().defer(unique_num)
for client in details:
queryset.append(client)
return list(set(queryset))
функция .defer('unique_num') все еще возвращается и отображается в наборе запросов. Предоставленная функция является функцией поиска
.defer('unique_num')
все еще возвращается и отображается в наборе запросов.
Это имеет смысл, поскольку .defer(…)
[Django-doc] означает, что вы будете лениво загружать этот столбец. Поэтому .defer(…)
часто используется для предотвращения загрузки колонки с большим количеством данных.
Можно использовать .values(…)
[Django-doc] для возврата словарей, содержащих только перечисленные выше значения.
from re import escape as rescape
def get_client_queryset(query=None):
regex = '|'.join(rescape(q) for q in query.split(' '))
return clients.objects.filter(
Q(name__iregex=regex) |
Q(number__iregex=regex) |
Q(email__iregex=regex)
).values('name', 'number', 'email')
Однако, возможно, будет лучше вернуть объекты модели, а затем сериализовать их в JSON-блоб (или другой формат вывода) с помощью Serializer [drf-doc]: REST-фреймворк Django создан для создания REST API. Можно определить такой API для результатов поиска и решить, какие данные передавать клиенту. В этом случае queryset возвращает 'unique_num'
, но не сериализуется:
from re import escape as rescape
from rest_framework import serializers
class ClientSerializer(serializer.ModelSerializer):
class Meta:
model = Client
exclude = ['unique_num']
def get_client_queryset(query=None):
regex = '|'.join(rescape(q) for q in query.split(' '))
return clients.objects.filter(
Q(name__iregex=regex) |
Q(number__iregex=regex) |
Q(email__iregex=regex)
)
тогда вид выглядит следующим образом:
serializer = ClientSerializer(get_client_queryset(), many=True)
data = serializer.data