Django Many to Many - полиморфный
В приложении Django у меня есть три модели:
- Услуга
- Продукт
- Применяемый налог
Я хочу создать отношения "многие ко многим" между Service и AppliedTax и между Product и AppliedTax. Обычно у меня есть промежуточная модель (т.е. AppliedTaxTaxable) с тремя полями (applied_tax_id, taxable_type и taxable_id), а taxable_type + taxable_id будет составным внешним ключом для каждой связанной модели, причем taxable_type будет иметь в качестве значения имя связанной модели (Service или Product в моем случае), а поле taxable_id - id связанной записи соответствующей модели.
Я понимаю, как заставить его работать с необработанными запросами, но есть ли способ "Django" сделать это с отношениями ManyToMany? Пока что мне не повезло с этим. У меня нет большого опыта работы с Django, но я надеюсь, что есть способ сделать это без использования необработанных запросов.
Помогите :)
Это очень просто:
В вашей модели сервиса:
class Service(model.Model):
...
...
taxes = ManyToManyField("AppliedTax")
Ваша модель продукта:
class Product(model.Model):
...
...
taxes = ManyToManyField("AppliedTax")
Тогда использование тоже очень просто:
product.taxes.add(<AppliedTax instance>)
Выбор:
product.taxes.all()
Фильтрация:
product.taxes.filter(is_vat=True) # you can filter by AppliedTax's fields.
Больше документации здесь
После некоторых раздумий я поискал получше и наткнулся на django-polymorphic. Здесь довольно простое объяснение того, как это работает, для базовой установки, и это делает то, что я описываю в своем вопросе. Реализованная схема немного отличается от того, что я описал, но в итоге мы получим одну промежуточную таблицу для всех связанных моделей.