【问题标题】:Problems adding SlugField field type (Django 1.6.3)添加 SlugField 字段类型的问题 (Django 1.6.3)
【发布时间】:2015-01-13 04:56:59
【问题描述】:

我想和你分享这个案例:

我有 AlbumsArtistsTracks 的模型

  • 一个 Artist 可能有许多 Albums
  • 一个 Album 可能有许多 Tracks
  • 很多 Tracks 在里面一个 Album(也可能是ManyToMany ..)

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

我向南执行迁移:

(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; 

但是,当我去数据库时,直接到Django给我带来的数据库结构,我看到slug字段无效......这个可以在这个url中详细说明https://cldup.com/-F9SQ2D3W8.jpeg

为了测试这个 slug 是否有效,我创建了指向 AlbumListView 基于类的视图的 url “专辑”

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 如下:这里我定义了一个查询集,用于恢复艺术家专辑,并使用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

当我在浏览器中转到视图 /albums 时,我看到以下消息:

no such column: albums_album.slug

这是我浏览器中的错误图片,请查看此网址:

我的问题可能是什么?为什么迁移不起作用? 感谢您的指导:)

【问题讨论】:

    标签: python django slug


    【解决方案1】:

    看起来您已将slug 添加到模型AFTER 运行syncdbBEFORE 运行convert_to_south。特别是关于您的案例南的开发人员在控制台中显示警告消息:

    请注意,South 假设应用程序的模型与 数据库(即自上次同步数据库以来您没有更改它);如果你有, 你应该删除相册/迁移目录,恢复 models.py 所以 它与数据库匹配,然后重试。

    为了解决您的问题,您应该:

    • 从专辑中删除 SlugField(在控制台输出中您应该也删除艺术家)
    • 从相册应用中删除迁移文件夹
    • 运行 ./manage.py convert_to_south 相册
    • 运行 ./manage.py 迁移相册
    • 添加 SlugField
    • 运行 ./manage.py schemamigration albums --auto(将默认值指定为 '')
    • 运行 ./manage.py 迁移相册
    • 利润!

    【讨论】:

    • Alex 感谢您的指导。您的支持非常有用
    猜你喜欢
    • 2019-04-13
    • 1970-01-01
    • 1970-01-01
    • 2019-04-09
    • 2020-12-21
    • 2023-03-19
    • 2018-11-01
    • 2018-05-25
    • 1970-01-01
    相关资源
    最近更新 更多