Как обрабатывать отношения "многие-ко-многим" в Django без промежуточной таблицы?

Я унаследовал странную структуру таблицы:

class Customer(models.Model):
    account_number = models.CharField()

class Subscription(models.Model):
    account_number = models.CharField()

Итак, модели Customer и Subscription связаны между собой номерами счетов. Каждый клиент может иметь несколько подписок, а каждая подписка может иметь несколько клиентов, но нет промежуточной таблицы; нет таблицы "Account". Как мне поступить в такой ситуации? Если у меня есть набор запросов Subscription, как мне получить соответствующий набор запросов Customer без выполнения ужасно длинного запроса типа

customers = Customer.objects.filter(account_number__in=list(subscriptions.values_list('account_number', flat=True)))

Я пытаюсь избежать этого, потому что это создаст массивный запрос, выполнение которого займет очень много времени.

Поскольку у него нет таблицы m2m, это, вероятно, лучший способ сделать это. Однако вы можете немного оптимизировать запрос, чтобы использовать Django для использования подзапроса вместо списка номеров счетов в операторе where.

subs = subscriptions.only('account_number').all()
customers = Customer.objects.filter(account_number__in=subs) 

# if you print out the query you should see a subquery in the query where statement
print(customers.query)
Вернуться на верх