Исправление django inspectdb после импорта базы данных postgresql sample
Context: Я играю с установкой проекта DRF, используя базу данных postgresql sample, расположенную здесь: Postresql Sample DB
Проблема: База данных примера уже настроена с промежуточными таблицами film_category и film_actor. При использовании manage.py для inspectdb он явно генерирует эти промежуточные таблицы (FilmCategory и FilmActor), и они не служат никакой цели в коде, поскольку содержат только идентификаторы для двух связанных полей. Если бы я создавал их с помощью Django ORM, я мог бы просто объявить:
class Film(models.Model):
...
actors = models.ManyToManyField(Actor, related_name='films')
Django создает эти таблицы "за занавесом", поэтому они не занимают места в моем коде. Я попытался просто установить поле ManyToManyField следующим образом:
actors = models.ManyToManyField(Actor, db_table='film_actor', related_name='films')
categories = models.ManyToManyField(Category, db_table='film_category', related_name='films')
При попытке миграции, однако, это не удается, выдавая следующую ошибку:
psycopg2.errors.DuplicateTable: relation "film_actor" already exists
Я не думаю, что хочу создавать это поле ManyToManyField без явного указания ему, какую db_table использовать, потому что я считаю, что это создаст совершенно новую промежуточную таблицу, и я потеряю доступ ко всем данным, уже хранящимся в этих промежуточных таблицах в исходной базе данных примера.
Я смог заставить его работать без ошибок и ожидаемые операции функционируют нормально, сделав:
actors = models.ManyToManyField(Actor, through='FilmActor', related_name='films')
Но теперь у меня есть явно определенная модель FilmActor и FilmCategory в моем models.py, которую я не могу удалить без возникновения ошибок:
class FilmActor(models.Model):
actor = models.ForeignKey(Actor, models.CASCADE)
film = models.ForeignKey(Film, models.CASCADE)
last_update = models.DateTimeField()
class FilmCategory(models.Model):
film = models.ForeignKey(Film, models.CASCADE)
category = models.ForeignKey(Category, models.CASCADE)
last_update = models.DateTimeField()
Кто-нибудь имел дело с явно определенными промежуточными таблицами, сгенерированными из существующей БД с помощью inspectdb? Есть ли способ избавиться от этих моделей, которые были сгенерированы, и при этом разрешить обычные операции ManyToMany? Технически то, что я хочу сделать, работает, просто мне кажется, что явное объявление этих двух промежуточных таблиц в качестве моделей в моем коде, когда они не имеют никаких дополнительных данных (кроме "last_update"), выглядит некрасиво.