У менядовольно сложный Джанго запрос
class Supplier(Model) :
pass
class Customer(Model) :
pass
class Dock(Model) :
pass
class SupplierDockAccess(Model) :
supplier = ForeignKey(Supplier)
dock = ForeignKey(Dock)
class SupplierCustomerAccess(Model):
supplier = ForeignKey(Supplier)
customer = ForeignKey(Customer)
У меня есть экземпляр Клиента, и я хотел бы получить все доки, что клиент имеет доступ. Клиенты имеют доступ к поставщикам через SupplierCustomerAccess, а поставщики имеют доступ к Docks через SupplierDockAccess. Я могу это сделать так:
# get the suppliers the customer has access to
supplier_customer_accesses = SupplierCustomerAccess.objects.filter(customer=customer)
suppliers = [s.supplier for s in supplier_customer_accesses]
# get the docks those suppliers have access to
supplier_dock_accesses = SupplierDockAccess.objects.filter(supplier__in=suppliers)
docks = [s.dock for s in supplier_dock_accesses]
... но затем полученный список доков содержит дубликаты, и я действительно думаю, что это oughtta можно сделать это на одном дыхании. Кто-нибудь хочет продемонстрировать какой-нибудь могучий джанго-фу?
Это также ограничивает вашу JOIN двумя таблицами, а не четырьмя, как ответ OP. –