#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;