Django South: автоматическая схема миграции не работала для добавления ManyToMany
Я довольно новичок на юге. Я работаю над проектом друзей, и он, кажется, уже провел некоторые миграции.
У меня есть модель, и я пытаюсь добавить к ней дополнительное поле ManyToMany. Это класс с owned_geofences
будучи полем, я пытаюсь добавить:
class UserProfile(models.Model):
owned_beacons = models.ManyToManyField(
Beacon,
blank=True,
null=True,
related_name='owned_beacons'
)
#trying to add this one below
owned_goefences = models.ManyToManyField(
Geofence,
blank=True,
null=True,
related_name='owned_geofences'
)
Приложение называется "профиль". Сначала я сделал это:
$ sudo python manage.py schemamigration profile --auto
+ Added M2M table for owned_goefences on profile.UserProfile
Created 0007_auto.py. You can now apply this migration with: ./manage.py migrate profile
Круто, похоже, сработало. Тогда я сделал это:
$ python manage.py migrate profile
Running migrations for profile:
- Migrating forwards to 0007_auto.
> profile:0007_auto
- Loading initial data for profile.
Installed 0 object(s) from 0 fixture(s)
Хорошо. Теперь это должно работать правильно?
Ну, похоже, это сработало. Я провел несколько тестов и..
>>> user = User.objects.get(pk=1)
<User: nick>
# just to test if user is working properly
>>> user.get_profile().owned_beacons
<django.db.models.fields.related.ManyRelatedManager object at 0x1104e7d50>
# this is the one that isn't working
>>> user.get_profile().owned_geofences
AttributeError: 'UserProfile' object has no attribute 'owned_geofences'
Кроме того, из любопытства я побежал:
$ python manage.py syncdb
Syncing...
Creating tables ...
Installing custom SQL ...
Installing indexes ...
Installed 0 object(s) from 0 fixture(s)
Synced:
> django.contrib.auth
> django.contrib.contenttypes
> django.contrib.sessions
> django.contrib.sites
> django.contrib.messages
> django.contrib.staticfiles
> django.contrib.admin
> django.contrib.admindocs
> south
Not synced (use migrations):
- pp.apps.careers
- pp.apps.contact
- pp.apps.geofencemanager
- pp.apps.locationmanager
- pp.apps.messagemanager
- django_extensions
- pp.profile
- pp.apps.beaconmanager
(use ./manage.py migrate to migrate these)
Почему они не синхронизируются? Я подумал, что что-то напутал, поэтому воспользовался советом выше и побежал:
$ python manage.py migrate
Running migrations for careers:
- Nothing to migrate.
#etc for all of them
Может кто-нибудь, пожалуйста, пролить свет на то, что здесь происходит?
1 ответ
Прежде всего, если вы бежите syncdb
приложения, которые уже имеют миграции, будут игнорироваться, поэтому они не синхронизируются.
Во-вторых, проблема не на юге, она прошла миграцию нормально, вы должны проверить вашу базу данных, просто чтобы убедиться, что она создала сквозную таблицу ('appname_userprofile_geofence', или что-то в этом роде), я уверен, что она сделала, так как она сказала так: > profile:0007_auto
также это не дало бы вам DatabaseError
если миграция не была сделана, не AttributeError
,
Более того, все в порядке, убедитесь, что вы перезагрузили оболочку, чтобы она обновила версию UserProfile
модель.