django: перебор элементов в таблице ManyToMany без промежуточной модели (без использования ‘through’)

#django #django-models

#django #django-модели

Вопрос:

У меня есть простой случай с двумя моделями: Item и Category с множеством элементов между ними. Я хочу показать страницу со списком всех категорий и для каждой категории список элементов. У меня сотни категорий, поэтому django обращается к БД сотни раз (при переборе категорий и вызове items.all () для каждой из них). Мне нужно выбрать данные из промежуточной таблицы вручную и использовать select_related () для извлечения элемента и категории для каждой записи — один запрос вместо сотен.

Я знаю, что введение ‘through’ решило бы проблему, но я не хочу делать это сейчас, потому что это может нарушить существующий код (использование through делает невозможным использование add, create или assignment для создания отношений — чего я хочу пока избежать).

Итак, возможно ли это вообще без создания модели для промежуточной таблицы?

Ответ №1:

Вы могли бы создать модель для вашей существующей таблицы и просто не использовать ее в качестве поля through для m2m и сделать ее неуправляемой. например:

 class ItemCategory(models.Model):
    item = models.ForeignKey('Item')
    category = models.ForeignKey('Category')

    class Meta:
        db_table = 'the_name_of_the_existing_m2m_table'
        managed = False
  

Во всяком случае, что-то вроде этого.

Комментарии:

1. Мне пришлось добавить app_label в мета-класс, чтобы мое исправление заработало.