Запрос для поля ManytoMany с через в Django

У меня есть модели в 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()

Но это просто возвращает Объект Классификации. Существует ли способ получить Данные объектов Сбора для Пары через Операции, которые я уже запросил?

Или я делаю это полностью неправильно?

6
задан tshepang 17 December 2013 в 20:29
поделиться

2 ответа

Учитывая совет Майчука для переименования «плата» на «классификацию»:

Имя по умолчанию для платы за объекты на модели активности будет SHEET_SET. Таким образом, чтобы получить ваши цены, сделайте это:

for a in Activity.objects.all():
    a.fee_set.all() #gets you all fees for activity

Есть одно, хотя, как вы можете видеть, вы в конечном итоге выполняете 1 Выбрать на каждом объекте активности для сборов, есть несколько приложений, которые могут помочь с этим, например, Django-Batch-Select делает только 2 запроса в этом случае.

6
ответ дан 16 December 2019 в 21:39
поделиться

Прежде всего, я думаю, вы неправильно назвали вашу поле. Это:

fee = models.ManyToManyField(Classification, through='Fee')

должно быть скорее, чтобы:

classifications = models.ManyToManyField(Classification, through='Fee')

как Множество относится к списку связанных объектов.

В общем Manytomanyfield, afaik, находится только ярлык Django для обеспечения легкой выборки всех связанных сопутствующих объектов (классификация в вашем случае), с таблицей ассоциации прозрачна для модели. То, что вы хотите, это таблица ассоциации (плата в вашем случае) не является прозрачным.

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

2
ответ дан 16 December 2019 в 21:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: