0

私はdjangoとsouthを理解しようとしていますが、stale contenttype問題が発生したようです-SOまたはGoogleで修正を見つけることができません。

したがって、まず、django==1.6 に単純なプロジェクトを作成し、インストール済みのアプリに次の内容を含めます。

INSTALLED_APPS = (
    'django.contrib.auth',
    'django_browserid',  # Load after auth
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django.contrib.sitemaps',
    # Uncomment the next line to enable the admin:
    'django.contrib.admin',
    # Uncomment the next line to enable admin documentation:
    # 'django.contrib.admindocs',
    'south',
)

AUTH_USER_MODEL = 'auth.User'

これで実行し、syncdbこの段階ではスーパーユーザーを作成しません。

ここで、新しいアプリloginappを作成しAbstractUser、次のように作成します。

#loginapp/models.py
class MyUser(AbstractUser):
    is_admin_enabled = models.BooleanField(default=True) # new field

私のsettings.pyで次を変更します。

AUTH_USER_MODEL = "loginapp.MyUser"

今、ログインアプリで実行します(辞書に追加loginappしますINSTALLED_APPS):

python manage.py schemamigration loginapp --initial && python manage.py migrate loginapp

..これまでのところすべて問題ありません-南がデータベースに新しいユーザーモデルを作成したことがわかります。

ここで、戻っsyncdbて自分のプロジェクトを実行すると、次のようになります。

The following content types are stale and need to be deleted:

    auth | user

Any objects related to these content types by a foreign key will also
be deleted. Are you sure you want to delete these content types?
If you're unsure, answer 'no'.

..ユーザーモデルが変更され、デフォルトモデルが廃止されたことをdjangoが認識していると思います。ここで「yes」を使用してみましたが、DB テーブルがまだ存在していることがわかります。おそらく、syncdb がデータベース テーブルを削除しないためです。

そもそも上記の問題を回避するにはどうすればよいですか?loginappサウスを使用して、DBのデフォルトのdjangoユーザーモデルではなく、自分で定義されたユーザーモデルが必要です。

この問題を解決するための手がかり/方向性を本当に感謝します。

4

1 に答える 1

0

Django 1.7 移行を使用して (から継承する) に移行する同様の問題に遭遇しauth.models.Usermyapp.User既存AbstractUserの運用管理者ログ テーブル エントリを消去したくなかったUserので、これを完全に正しくすることを主張しました。

myappp.models を次のように仮定します。

from django.db import models
from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
    class Meta:
        db_table = 'auth_user'

これが私が思いついたものです:

from django.db import models, migrations
import django.utils.timezone
import django.core.validators

MYAPP = 'myapp'

def migrate_func(old, new, apps, schema_editor):
    ContentType = apps.get_model("contenttypes", "ContentType")
    db_alias = schema_editor.connection.alias
    ct = ContentType.objects.using(db_alias).get(app_label=old, model='user')
    ct.app_label = new
    ct.save()

def forwards_func(apps, schema_editor):
    migrate_func('auth', MYAPP, apps, schema_editor)

def backwards_func(apps, schema_editor):
    migrate_func(MYAPP, 'auth', apps, schema_editor)


class Migration(migrations.Migration):

    dependencies = [
        ...
    ]

    database_operations = [
        migrations.RunPython(forwards_func, backwards_func)
    ]

    state_operations = [
        migrations.CreateModel(
            name='User',
            fields=[
                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
                ...
            ],
            options={
                'db_table': 'auth_user',
            },
            bases=(models.Model,),
        ),
    ]

    operations = [
        migrations.SeparateDatabaseAndState(
            state_operations=state_operations),
        migrations.SeparateDatabaseAndState(
            database_operations=database_operations)
    ]
于 2014-12-28T00:30:09.857 に答える