Фильтрация моделей Django, но только сквозной таблицы «многие ко многим»

#django #django-models #django-views

#django #django-модели #django-views

Вопрос:

Я пытаюсь перечислить все контакты, но только основной адрес. Существует связь «многие ко многим» между контактом и адресом с пользовательской сквозной таблицей, которая содержит дополнительные атрибуты, такие как «первичный». Ниже приведена суть моделей.

 class Address(models.mode):
    address1 = models.CharField(max_length=100)
    ...    

 class Contact(models.model):
            ...
            address = models.ManyToManyField(Address, through='ContactAddress')
    
     class ContactAddress(models.model):
            contact = models.ForeignKey(Contact, on_delete=models.CASCADE)
            address = models.ForeignKey(Address, on_delete=models.CASCADE)
            address_type = models.ForeignKey(ContactAddressType, on_delete=models.CASCADE)
            primary = models.BooleanField(default=False)
  

Contact.objects.all() возвращает все контакты.

Я перебираю их, чтобы получить контактные данные:

 for contact in contact
  

Затем я перебираю адреса во внутреннем цикле:

 for a in contact.address.all
  

Как мне ограничить адрес только адресом с primary = True в ContactAddress через таблицу? Мне все еще нужны все контакты, но только основной адрес для каждого контакта. Я надеялся отфильтровать на верхнем уровне, где я возвращаю все контакты, но все, что я пробовал, ограничивает контакты, которые возвращаются, только теми, у которых есть основной адрес. Мне нужны все контакты, но только основной адрес для каждого (или без адреса, если для контакта не задан основной адрес).

В принципе, я хочу создать следующий SQL с помощью ORM:

 select * from contact 
join contact_address on contact.id = contact_address.contact_id 
join address on contact_address.address_id = address.id 
where contact_address.primary = true; 
  

Я понимаю, что мог бы использовать raw, но поскольку я новичок в django, я надеялся узнать, как получить те же результаты с помощью ORM.

Комментарии:

1. Несколько контактов могут иметь один и тот же адрес?

2. Да, рассмотрим набор контактов из одной и той же компании, все из которых имеют один и тот же адрес офиса. Адрес сохраняется только один раз и может быть обновлен для всех контактов, если компания перемещается.

3. ** добавлено в исходное сообщение ** В принципе, я хочу создать этот sql с помощью ORM select * из contact join contact_address на contact.id = contact_address.contact_id присоединить адрес к contact_address.address_id = address.id где contact_address.primary = true;