django добавляет поле / таблицу ManyToMany к существующей схеме, ошибка related_name - PullRequest
8 голосов
/ 21 октября 2010

У меня есть существующий проект с моделями (пользователи и книги). Я хотел бы добавить поле ManyToMany (M2M) к существующей модели Books, но команда syncbb этого не делает.

Подробности: в книгах уже есть поле FK, которое отображается на пользователя, и я хочу добавить новое поле M2M (считыватели), которое также отображается на пользователя. Как вы знаете, syncdb в Django заботится только о таблицах, поэтому добавить нормальное поле легко, но M2M требует новую таблицу соединений (app_books_user), поэтому разве не следует добавить syncdb cmd, как любую другую новую таблицу? Он создал мою другую объединенную таблицу для поля продавцов Книги.

Когда я запустил syncdb, я первоначально получил сообщение об ошибке, предписывающее мне использовать аргумент related_name, чтобы помочь различать две ссылки на User. Я добавил их. Однако, когда я снова запускаю syncdb, он не создает новую таблицу соединений (но теперь она не содержит ошибок). Новое поле существует, когда я просматриваю его через командную консоль, но не могу его использовать, поскольку таблица соединения не существует. Я посмотрел на код sql через cmd 'sqlall', и он выводит SQL для новой таблицы, но он не выполняется.

Чего мне не хватает? Должен ли я просто форсировать SQL (из sqlall) через браузер базы данных? Будет ли это иметь какие-либо последствия? Код следует:

Models.py

from django.contrib.auth.models import User

class Seller(models.Model):
    ...

class Books(models.Model):

    name=models.CharField(max_length=50)
    author=models.ForeignKey(User, related_name='creator')
    readers=models.ManyToManyField(User, blank=True, related_name='viewers')
    sellers=models.ManyToManyField(Seller)

Спасибо

1 Ответ

6 голосов
/ 29 октября 2010

syncdb не изменяет существующие таблицы (модели).Что происходит, даже если добавление M2M не приводит к изменению таблицы (нужно просто добавить таблицу соединения), syncdb не создает новую таблицу, поскольку видит, что модель уже есть в базе данных, и пропускает ее.См. документы syncdb

[syncdb] Создает таблицы базы данных для всех приложений в INSTALLED_APPS, таблицы которых еще не были созданы.

Этонемного запутанно, поскольку технически эта таблица не была создана, но поведение имеет смысл: «Была ли создана таблица для этой модели? Да! Тогда не синхронизируйте ее».

В общем, django делаетне предоставить механизм для миграции схем базы данных (т.е. добавить столбцы и тому подобное).Таким образом, вы должны делать такие вещи с помощью необработанного SQL или с помощью стороннего инструмента.Я настоятельно рекомендую проверить Юг .

...