Проблемы добавления типа поля SlugField (Django 1.6.3)


Я хочу поделиться с вами этим случаем:

У меня есть модели Albums, Artists, и Tracks

  • Один Artist может иметь много Albums
  • Один Album может иметь много Tracks
  • Многие Tracks находятся внутри одного Album (может быть Многотоманы тоже ..)

В модель Albums я хочу добавить поле типа SlugField. Это следующее:

from django.db import models
from artists.models import Artists

    class Album(models.Model):
        title = models.CharField(max_length=255)
        cover = models.ImageField(upload_to='albums') 
        slug = models.SlugField(max_length=100)
        artist = models.ForeignKey(Artists)

        def __unicode__(self):
            return self.title

Я выполняю migratios с юг:

(myvenv)➜  myvenv  ./manage.py syncdb

Syncing...
Creating tables ...
Installing custom SQL ...
Installing indexes ...
Installed 0 object(s) from 0 fixture(s)

Synced:
> django.contrib.admin
> django.contrib.auth
> django.contrib.contenttypes
> django.contrib.sessions
> django.contrib.messages
> django.contrib.staticfiles
> south
> albums

Not synced (use migrations):
- django_extensions
- djcelery
- tracks
- artists
- userprofiles
(use ./manage.py migrate to migrate these)

(myenv)➜  myenv  ./manage.py convert_to_south albums

Creating migrations directory at '/home/bgarcial/workspace/myenv/sfotipy/albums/migrations'...
Creating __init__.py in '/home/bgarcial/workspace/myenv/sfotipy/albums/migrations'...
+ Added model albums.Album
Created 0001_initial.py. You can now apply this migration with: ./manage.py migrate albums
- Soft matched migration 0001 to 0001_initial.
Running migrations for albums:
- Nothing to migrate.
- Loading initial data for albums.
Installed 0 object(s) from 0 fixture(s)

App 'albums' converted. Note that South assumed the application's models matched the   database
(i.e. you haven't changed it since last syncdb); if you have, you should delete  the  albums/migrations directory, revert models.py so it matches the database, and try again.

(myenv)➜  myenv  ./manage.py migrate albums         

Running migrations for albums:
- Nothing to migrate.
- Loading initial data for albums.
Installed 0 object(s) from 0 fixture(s) 

Если я ввожу команду ./manage.py sqlall, модель альбомов уже появляется с полем slug в базе данных

(Sfoti.py)➜  sfotipy  ./manage.py sqlall albums
BEGIN;
CREATE TABLE "albums_album" (
    "id" integer NOT NULL PRIMARY KEY,
    "title" varchar(255) NOT NULL,
    "cover" varchar(100) NOT NULL,
    "slug" varchar(100) NOT NULL,
    "artist_id" integer NOT NULL REFERENCES "artists_artists" ("id")
);
CREATE INDEX "albums_album_f52cfca0" ON "albums_album" ("slug");
CREATE INDEX "albums_album_7904f807" ON "albums_album" ("artist_id");
COMMIT; 
Но когда я иду к базе данных, непосредственно к структуре базы данных, которую принес мне Джанго, я вижу, что поле слизней не эффективно... Это может подробно описать их в этом url https://cldup.com/-F9SQ2D3W8.jpeg

С целью проверить, что этот слизняк работает, я создаю url-адрес "albums", который указывает на класс AlbumListView, основанный вид

from django.conf.urls import patterns, url
from artists.views import AlbumListView

urlpatterns = patterns('',
    url(r'^albums/$', AlbumListView.as_view(), name='album_list'),
    url(r'^albums/(?P<artist>[w-]+)/$', AlbumListView.as_view(), name='album_list'),
)

Представление на основе класса AlbumListView выглядит следующим образом: здесь я определяю queryset для восстановления альбомов исполнителя и с переменной kwargs путь в том, как взять

class AlbumListView(ListView):
    model = Album
    template_name = 'album_list.html'

    def get_queryset(self):
        if self.kwargs.get('artist'):
            queryset = self.model.objects.filter(artist__slug=self.kwargs['artist'])
        else:
            queryset = super(AlbumListView, self).get_queryset()
        return queryset

Когда я перехожу к просмотру / альбомам в моем браузере, я вижу следующее сообщение:

no such column: albums_album.slug

Это изображение ошибки в моем браузере, проверьте этот url, пожалуйста:

Введите описание изображения здесь

В чем может быть моя проблема? Почему миграция не происходит работает? Спасибо за вашу ориентацию:)

1 3

1 ответ:

Похоже, что вы добавили slug в модель после запуска syncdb и Перед запуском convert_to_south. В частности, о вашем случае разработчик south выводит на консоль предупреждающее сообщение:

Обратите внимание, что Юг предположил, что модели приложения соответствуют база данных(то есть вы не изменили ее с момента последнего syncdb); если у вас есть, вы должны удалить каталог альбомы/миграции, вернуться models.py так что он соответствует базе данных, и повторите попытку.

Для исправления вашего проблема, вы должны:

  • Drop SlugField from Album (выглядит в выводе консоли, вы должны также удалить исполнителя)
  • Drop migrations folder from albums app
  • беги ./manage.py convert_to_south альбомы
  • беги ./manage.py миграция альбомов
  • Добавить Слагфилд
  • беги ./manage.py альбомы schemamigration --auto (укажите значение по умолчанию как ")
  • беги ./manage.py миграция альбомов
  • прибыль!