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. Здесь довольно простое объяснение того, как это работает, для базовой установки, и это делает то, что я описываю в своем вопросе. Реализованная схема немного отличается от того, что я описал, но в итоге мы получим одну промежуточную таблицу для всех связанных моделей.

Вернуться на верх