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
Вернуться на верх