Как получить конкретную запись в таблице поиска в Django

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

Вот сокращенная версия таблицы клиентов:

id last first etc
100426 Smith John etc
114988 Johnson Thomas etc

Пример таблицы телефонов:

id client_id type_id is_primary number
1 100426 1 t 427-567-8382
2 100426 2 f 427-567-7789
3 114988 1 t 914-223-4597

И, наконец, таблица phone_type:

id type
1 mobile
2 home
3 office
4 condo

Выдержка из модели клиента:

class Client(models.Model):
    id = models.IntegerField(primary_key=True)     
    last = models.CharField(max_length=32)
    first = models.CharField(max_length=32)
    phone = models.ForeignKey(
        Phone,
        on_delete=models.PROTECT,
        blank=False,
        null=False
    )

Модель телефона:

class Phone(models.Model):
    id = models.IntegerField(primary_key=True)
    client_id = models.IntegerField
    type_id = models.ForeignKey(
        PhoneType,        
        on_delete=models.PROTECT,
        blank=False,
        null=False)
    is_primary = models.BooleanField
    country_code = models.CharField(max_length=5)
    phone_number = models.CharField(max_length=16)

И тип телефона:

class PhoneType(models.Model):
    id = models.SmallIntegerField(primary_key=True)
    type = models.CharField(max_length=16, blank=False, null=False)

Мой ClientListView:

class ClientListView(ListView):
    model = Client
    template_name = 'client/client_list.html'
    context_object_name = 'clients'

    def get_queryset(self):
        return Client.objects.order_by('-id').filter(status_id=3).select_related(Phone)

Функция get_queryset пока является условным обозначением.

Как я могу заменить функцию get_queryset, чтобы я мог перечислить основной номер телефона для каждого клиента на основе поля "is_primary" в таблице phones?

Я бы использовал prefetch api с queryset поверх него.

from django.models import Prefetch

Client.objects
    .prefetch_related(
        'phone_numbers',
        queryset=Phone.objects.filter(is_primary=True),
    )

Но это будет работать только в том случае, если ваша модель определена правильно. В вашем классе Phone, client_id, похоже, является внешним ключом к Client. Таким образом, у вас должно быть:

Phone(models.Model):
    client = models.ForeignKey('Client', related_name='phone_numbers')
Вернуться на верх