Как получить конкретную запись в таблице поиска в 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')