У меня есть модели в Django, которые являются чем-то вроде этого:
class Classification(models.Model):
name = models.CharField(choices=class_choices)
...
class Activity(models.Model):
name = models.CharField(max_length=300)
fee = models.ManyToManyField(Classification, through='Fee')
...
class Fee(models.Model):
activity = models.ForeignKey(Activity)
class = models.ForeignKey(Classification)
early_fee = models.IntegerField(decimal_places=2, max_digits=10)
regular_fee = models.IntegerField(decimal_places=2, max_digits=10)
Так как идея будет этим будет ряд сборов, связанных с каждой парой Действия и Классификации. Классификация похожа на Студента, Штат, и т.д.
Я знаю, что часть работает правильно.
Затем в моем приложении, я запрашиваю для ряда Операций с:
activities = Activity.objects.filter(...)
Который возвращает список операций. Я должен отобразиться в своем шаблоне что список Операций с их Сборами. Что-то вроде этого:
Activity Name
Student Early Price - $4
Student Regular Price - $5
Staff Early Price - $6
Staff Regular Price - $8
Но я не знаю о простом способе добраться, эта информация без определенного получают запрос объекта Сборов для каждой пары действия/класса.
Я надеялся, что это будет работать:
activity.fee.all()
Но это просто возвращает Объект Классификации. Существует ли способ получить Данные объектов Сбора для Пары через Операции, которые я уже запросил?
Или я делаю это полностью неправильно?
Учитывая совет Майчука для переименования «плата» на «классификацию»:
Имя по умолчанию для платы за объекты на модели активности будет SHEET_SET. Таким образом, чтобы получить ваши цены, сделайте это:
for a in Activity.objects.all():
a.fee_set.all() #gets you all fees for activity
Есть одно, хотя, как вы можете видеть, вы в конечном итоге выполняете 1 Выбрать на каждом объекте активности для сборов, есть несколько приложений, которые могут помочь с этим, например, Django-Batch-Select делает только 2 запроса в этом случае.
Прежде всего, я думаю, вы неправильно назвали вашу поле. Это:
fee = models.ManyToManyField(Classification, through='Fee')
должно быть скорее, чтобы:
classifications = models.ManyToManyField(Classification, through='Fee')
как Множество относится к списку связанных объектов.
В общем Manytomanyfield, afaik, находится только ярлык Django для обеспечения легкой выборки всех связанных сопутствующих объектов (классификация в вашем случае), с таблицей ассоциации прозрачна для модели. То, что вы хотите, это таблица ассоциации (плата в вашем случае) не является прозрачным.
Итак, что я бы сделал, это удалить поле Многотоманифилда из активности и просто получить все сборы, связанные с деятельностью. И тогда, если вам нужна классификация для каждой платы, получите классификацию отдельно.